如何比较C#中的两个词典? 字典有不同的计数和顺序 如果列表A和列表B的键匹配,我想带上列表B的值并修改列表A的值

如何比较C#中的两个词典? 字典有不同的计数和顺序 如果列表A和列表B的键匹配,我想带上列表B的值并修改列表A的值,c#,dictionary,C#,Dictionary,示例代码: public static List<Dictionary<string, string>> ListDicOne = new List<Dictionary<string, string>>(); public static List<Dictionary<string, string>> ListDicTwo = new List<Dictionary<string, string>>

示例代码:

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

我猜一下,假设你真的只想处理两个字典,而不是两个包含多个一项字典的列表,这根本没有任何意义

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

ListDicOne
的最终状态为:

("AABC", "oooo")
("ABCD", "WOW")
("EFGH", "test")
我希望你会觉得这很清楚,很有用

**更新** 考虑具有非唯一键的字符串列表:


看看这个答案:希望它有帮助。为什么你要使用字典列表,我认为只使用字典就足够了。我同意@Sajid的观点,似乎你使用的是
字典
,就像是
键值对
。在你的代码更新之后,请注意你有七(7)个不同的字典,每个字典只有一个元素,存储在两个列表中。我不认为这是你想要做的。首先,修正你的清单,把它们编成字典。否则,任何解决方案都不适用于您。如果你不明白这一点,我们就不能再往前走了。我希望字典有一个重复的键。这似乎是一个奇怪的请求,但ListDicOne的键、值是从文本文件读取的,即使该行是重复的,也不希望删除该行。但是我认为唯一化密钥是正确的。如果密钥不是唯一的,那么它就不是密钥,你不能使用字典。您可以使用
列表
,它只是一个元组列表,每个元组有两个字符串。但是,如果列表1中重复了一个键,那么列表2中的值是否应同时应用于这两个键?如果列表2有一个具有不同值的重复键呢?还是不可能?如果重复的键值对完全相同,您可以在列表上执行
Distinct()
,并使用
字典。检查。@Andrew在这种情况下,我们可以根据首先找到的密钥进行更新。或者,如果列表B具有相同的键,则值应该都相同。正如你所说,我认为我的请求不合逻辑。@Caglia,我添加了另一种方法,如果你想支持重复的“键”,它可能对你有用。如果您还想将“AABC”添加到
ListOne
,我想您可以自己找到方法。但如果有必要,请随时询问。
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];
}
("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);
    }
}
("ABCD", "WOW")
("ABCD", "WOW")
("EFGH", "test")