我有一个字典列表:
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循环,我想要添加一些项目。
答案 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
的新实现。