0

出于 XML 序列化的目的,我不得不解散我正在使用的 Dictionary 集合。我写了一个非常简单的替代方案,它由 2 个类组成:

  • NameValueItem:包含名称(键)和值
  • NameValueCollection:派生自 CollectionBase 并维护 NameValueItem 对象的集合。

我已经包含了一些标准方法来帮助维护集合(添加、包含和删除)。所以就像大多数字典类型一样,名称(或键)是唯一的:

    public bool Contains(NameValueItem item)
    {
        foreach (NameValueItem lItem in List)
            if(lItem.Name.Equals(item.Name))
                return true;

        return false;
    }

Add 使用此 Contains 方法来确定是否将给定项目包含到集合中:

    public void Add(NameValueItem item)
    {
        if (!Contains(item))
            List.Add(item);
    }

作为沼泽标准,这段代码看起来简单明了,但事实证明它有点迟钝。有什么可以做的来提高它的性能吗?或者我可以使用的替代品?

我正在考虑创建一个派生自 HashSet 的 NameValueHashSet。

可选的...:

我有一个问题,我打算在单独的线程中提出,但我会留给你来决定你是否愿意解决这个问题。

我想向 NameValueCollection、Names 和 Values 添加 2 个属性,它们从 NameValueItem 对象的集合中返回一个字符串列表。相反,我将它们构建到 GetNames() 和 GetValues() 方法中,因为我必须构建集合(即创建一个列表(名称/值),遍历集合,将名称/值添加到列表并返回列表)。

这是一个更好的选择吗?在良好的编码实践、性能等方面?由于我对属性的想法一直是尽可能地将其剥离,因此应该只存在引用、算术等,没有任何层级的过程。如果是这样的话,那么它应该被内置到一个方法中。想法?

4

1 回答 1

0

也许您不应该尝试重建框架已经提供的功能?您的字典实现将表现不佳,因为它无法扩展。内置Dictionary<TKey, TValue>具有 O(1) 访问性能,并且对于大多数插入和删除操作(除非存在冲突或必须扩展内部存储)。

您可以扩展现有字典以提供 XML 序列化支持;看到这个问题和答案:包含字典成员的序列化类

至于你的第二个问题 - Dictionary 已经提供了获取键和值的 IEnumerable 的方法。这会枚举调用者请求的键和/或值;List那是延迟执行,并且可能是每次都构建完整的首选方法(这需要遍历字典中的所有元素)。如果调用者想要一个列表,那么他们就这样做dictionary.Values.ToList()

于 2014-03-17T17:03:16.917 回答