【问题标题】:How to compare two dictionaries in C#?如何在 C# 中比较两个字典?
【发布时间】:2020-05-30 22:52:17
【问题描述】:
  1. 有不同的计数和不同的字典顺序
  2. 如果列表A和列表B的key匹配,我想带列表B的值,修改列表A的值。

示例代码:

public static List<Dictionary<string, string>> ListDicOne = new List<Dictionary<string, string>>();

public static List<Dictionary<string, string>> ListDicTwo = new List<Dictionary<string, string>>();

(...)
ListDicOne[0].Add("ABCD", "");          // empty value
ListDicOne[1].Add("ABCD", "");          
ListDicOne[2].Add("EFGH", "test");

ListDicTwo[0].Add("AABC", "oooo");
ListDicTwo[1].Add("ABCD", "WOW");
ListDicTwo[2].Add("CCDD", "haha");
ListDicTwo[3].Add("CCDD", "haha");

预期结果值:

// Console Write key and value of ListDicA 

ABCD \t WOW
ABCD \t WOW
EFGH \t test

【问题讨论】:

  • 看看这个答案:stackoverflow.com/a/9547463/3247471希望对你有帮助。
  • 为什么要使用字典列表,我认为只要字典就足够了。
  • 我同意@Sajid,看来您使用的是Dictionary,就像它是KeyValuePair一样。
  • 代码更新后,请注意您有 七 (7) 个不同的字典,每个字典只有一个元素,存储在两个列表中。我不认为那是你想要做的。
  • 首先,修复您的列表并将它们制作成字典。否则,没有解决方案适合您。如果您不理解这一点,我们将无法继续前进。

标签: c# dictionary


【解决方案1】:

我会猜测一下,假设您真的只想处理两个字典,而不是处理许多单项字典的两个列表,这根本没有任何意义。

首先,字典应该这样声明(我也假设它们不必是公开的):

private static Dictionary<string, string> ListDicOne = new Dictionary<string, string>();

private static Dictionary<string, string> ListDicTwo = new Dictionary<string, string>();

然后,用法可能是这样的:

ListDicOne.Add("AABC", ""); // I changed the key, they must be unique
ListDicOne.Add("ABCD", "");
ListDicOne.Add("EFGH", "test");

ListDicTwo.Add("AABC", "oooo");
ListDicTwo.Add("ABCD", "WOW");
ListDicTwo.Add("CCDD", "haha");
ListDicTwo.Add("CCDE", "haha"); // I changed the key, they must be unique

foreach (var item in ListDicTwo)
{
    if (ListDicOne.ContainsKey(item.Key))
        ListDicOne[item.Key] = ListDicTwo[item.Key];
}

ListDicOne的最终状态是:

("AABC", "oooo")
("ABCD", "WOW")
("EFGH", "test")

我希望你觉得这个澄清和有用。

** 更新**

考虑具有非唯一的字符串列表:

private static List<Tuple<string, string>> ListOne = new List<Tuple<string, string>>();

private static List<Tuple<string, string>> ListTwo = new List<Tuple<string, string>>();

(...)

ListOne.Add(Tuple.Create("ABCD", ""));
ListOne.Add(Tuple.Create("ABCD", ""));
ListOne.Add(Tuple.Create("EFGH", "test"));

ListTwo.Add(Tuple.Create("AABC", "oooo"));
ListTwo.Add(Tuple.Create("ABCD", "WOW"));
ListTwo.Add(Tuple.Create("CCDD", "haha"));
ListTwo.Add(Tuple.Create("CCDD", "haha"));

foreach (var l2item in ListTwo)
{
    for (int i = 0; i < ListOne.Count; i++)
    {
        if (ListOne[i].Item1 == l2item.Item1)
            ListOne[i] = Tuple.Create(l2item.Item1, l2item.Item2);
    }
}

注意1:元组是不可变的,所以在更改Item2时需要创建一个新的。

注意2:当你需要改变迭代列表时,你不能使用foreach,因此我使用了for

注意 3:如果 ListTwo 恰好有两个不同的 key-value 组合(假设不会发生),则第二个将覆盖第一个。

这是您的测试值的最终结果:

("ABCD", "WOW")
("ABCD", "WOW")
("EFGH", "test")

【讨论】:

  • 我希望字典有一个重复的键。这似乎是一个奇怪的请求,但是 ListDicOne 的键、值是从文本文件中读取的,即使该行重复也不想删除该行。但我认为唯一的关​​键是正确的。
  • 如果他们的键不是唯一的,那么它就不是键,你不能使用字典。您可以使用List&lt;Tuple&lt;string, string&gt;&gt;,它只是一个包含两个字符串的元组列表。但是,如果一个键在列表 1 中重复,列表 2 中的值是否应该同时适用于两者?如果列表 2 有一个具有不同值的重复键怎么办?或者那不可能?如果重复的键值对完全相同,您可以在列表中使用Distinct() 并使用Dictionary。查看this question
  • @Andrew 在这种情况下,我们可以根据我们首先找到的密钥对其进行更新。或者如果列表 B 具有相同的键,则值应该都相同。正如你所说,我认为我的要求不合逻辑。
  • @Caglia,如果您想支持重复的 "keys",我添加了另一种可能对您有用的方法。如果您还想将“AABC”添加到ListOne,我想您可以自己了解如何做到这一点。但如有必要,请随时询问。
猜你喜欢
  • 2012-03-21
  • 2011-10-08
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
相关资源
最近更新 更多