像类一样使用Dictionary

时间:2014-03-17 16:54:03

标签: c# data-structures dictionary hashset collectionbase

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

  • NameValueItem:包含Name(Key)和Value
  • 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对象的Collection中返回字符串List。相反,我将它们构建到方法GetNames()和GetValues()中,因为我必须构建集合(即创建List(名称/值),迭代集合,将名称/值添加到List并返回List)。

这是一个更好的选择吗?在良好的编码实践,性能等方面?由于我对属性的看法一直是尽可能地剥离它,所以只有引用,算术等应该存在,没有任何进程层。如果是这种情况,则应将其构建到方法中。思考?

1 个答案:

答案 0 :(得分:0)

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

您可以扩展现有字典以提供XML序列化支持;看到这个问题和答案:Serialize Class containing Dictionary member

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