c# List< Dictionary<字符串,string>比;添加唯一的字典

本文关键字:添加 唯一 字典 string List Dictionary 字符串 lt | 更新日期: 2023-09-27 18:04:30

我有一个字典列表:

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.Value。在分组的情况下,这将导致列表中出现重复的字典。

如何避免在列表中添加重复的Dictionary ?

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

c# List< Dictionary<字符串,string>比;添加唯一的字典

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

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

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

然后,用HashSet<MyDictionary>代替List<Dictionary<string, string>>。因为集合不允许重复,所以你应该得到一个由唯一的字典集合组成的集合。

我是这样解决的:

我创建了一个新字典:

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);
}

您可以实现自己的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的新实现。