c#List <dictionary <string,string>&gt;添加独特的词典

时间:2015-07-24 07:37:52

标签: c# list dictionary

我有一个字典列表:

List<Dictionary<string, string>> items = new List<Dictionary<string, string>>();

foreach (var group in groupedItems)
{

    foreach (var item in group)
    {
         Dictionary<string, string> newItem = new Dictionary<string, string>();
         newItem.Add("name", item.Name);
         newItem.Add("value", item.Value);
    }
 }

items.Add(newItem);

基本上当我遍历分组的项目时,我创建了一个Dictionary,其中键是item.Name,value是item.Value。在分组的情况下,这将导致列表中出现重复的字典。

如何避免将重复的词典添加到此列表?

我有一个foreach循环,我想要添加一些项目。

3 个答案:

答案 0 :(得分:3)

首先想到的是创建自己的类extends Dictionary<string, string>并实现您自己的GetHashCode()Equals版本:

public class MyDictionary : Dictionary<string, string>
{
    public override int GetHashCode() 
    {
        ...
    }

    public override bool Equals(object source) 
    {
        ...
    }
}

Equals中实现你的等式机制,并在GetHashCode中实现一种机制,根据你的平等标准,为两个相同的词典产生相同的数值。

然后,您使用List<Dictionary<string, string>>而不是HashSet<MyDictionary>。由于集合不允许重复,因此您应该最终得到一组独特的字典集合。

答案 1 :(得分:1)

我用这种方式解决了这个问题:

我创建了一个新词典:

Dictionary<string, string> control = new Dictionary<string, string>();

然后我就这样做了:

Dictionary<string, string> newItem = new Dictionary<string, string>();
newItem.Add("name", item.Name);
newItem.Add("value", item.Value);

if (!control.ContainsKey(item.Name))
{
   control.Add(item.Name);
   items.Add(newItem);
}

答案 2 :(得分:0)

您可以实现自己的EqualityComparer来确定两个词典是否相同:

class EqualityComparer<Dictionary<string, string>> : IEqualityComparer<Dictionary<string, string>>
{

    public bool Equals(Dictionary<string, string> x, Dictionary<string, string> y)
    {
        // your code here
    }

    public int GetHashCode(Dictionary<string, string> obj)
    {
        // your code here
    }
}

现在您可以在检查新项目的存在时使用此比较器:

foreach (var g in groupedItems)
{
    Dictionary<string, string> newItem = new Dictionary<string, string>();

    foreach(var item in g) 
    {
        newItem.Add("name", item.Name);
        newItem.Add("value", item.Value);    
    }
    if (!items.Contains(newItem, new EqualityComparer()) items.Add(newItem);
}

因此,无需创建Dictionary的新实现。