检查多个具有相同键的字典是否具有相同的值

时间:2019-06-20 20:47:43

标签: c#

假设我有一系列词典。所有词典的键都完全相同。对于每个键,如果它们的键值与至少一个其他词典的键值相同,我想返回数组中的索引。

例如,如果有一个键“ a”,并且ArrayOfDictionaries[0]["a"]ArrayOfDictionaries[2]["a"]的求和结果均为7,我想将一个对(“ a”, [0,2])。

我对如何实现这一目标的逻辑非常困惑。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的逻辑,则可能看起来像这样。 filterDictionary将具有最终结果。

        var resultDictionary = new Dictionary<string, List<int>>();
        var filteredDictonary = new Dictionary<string, int[]>();

        var arrayOfDictionaries = new Dictionary<string, int>[]
        {
            new Dictionary<string, int> { { "a", 7 },{ "b",5},{ "c", 10 } },
            new Dictionary<string, int> { { "a", 8 },{ "b",6},{ "c", 10 } },
            new Dictionary<string, int> { { "a", 7 },{ "b",7},{ "c", 10 } },
        };


        for (var j = 0; j < arrayOfDictionaries.Length; j++)
        {
            foreach (var i in arrayOfDictionaries[j])
            {
                var uniqueKey = i.Key + i.Value.ToString();

                if (resultDictionary.ContainsKey(uniqueKey))
                {
                    resultDictionary[uniqueKey].Add(j);
                }
                else
                {
                    resultDictionary.Add(uniqueKey, new List<int> { j });
                }
            }
        }

        filteredDictonary = resultDictionary.Where(a => a.Value.Count() > 1).Select(a => a).ToDictionary(kv => kv.Key.Substring(0,1), kv => kv.Value.ToArray());

答案 1 :(得分:-1)

如果将字典数组命名为src,则对于每个键,可以将所有字典与匹配值组合在一起,然后转换为位置列表。将结果转换为Dictionary取决于您要如何处理结果重复键。

var ans2 = src[0].Keys.SelectMany(k => src.Select((d, i) => new { Key = k, Value = d[k], pos = i })
                                          .GroupBy(kvp => kvp.Value)
                                          .Select(kvpg => new { Key = kvpg.First().Key, Matches = kvpg.Select(kvp => kvp.pos).ToList() })
                      );