C#获取重复值的字典第一个键

时间:2014-03-11 10:59:47

标签: c# dictionary duplicates duplicate-removal keyvaluepair

我有以下词典:

Dictionary<int, int> myDict = new Dictionary<int, int>();
myDict.Add(0, 6);
myDict.Add(1, 10);
myDict.Add(2, 6);
myDict.Add(3, 14);
myDict.Add(4, 10);
myDict.Add(5, 10);

我已经知道如何获取所有重复值:

var duplicatedValues = myDict.GroupBy(x => x.Value).Where(x => x.Count() > 1);

但我想要的是以下内容:包含重复值的所有键的列表,但不包括最后重复的值。因此,在上面的列表中,重复值为10和6,我想要的是以下键的列表: 0,1,4(因此不包括2和5)

这样做的最佳方式是什么?

任何帮助将不胜感激。提前谢谢。

编辑:我确实设法通过修改我在互联网上找到的东西来完成这段代码,但说实话,我发现首先从密钥创建一个字符串然后再返回int有点愚蠢。我对Aggregate命令不熟悉,所以欢迎任何帮助如何修改以下代码:

var lookup = allIDs.ToLookup(x => x.Value, x => x.Key).Where(x => x.Count() > 1);

foreach (var item in lookup) {
    var keys = item.Aggregate("", (s, v) => s + "," + v);
    string[] split = keys.Split(',');
    for (int i = 0; i < split.Length - 1; i++) {
        if (!split[i].Equals("")) {
            Console.WriteLine("removing card nr: " + split[i]);
            CurrentField.removeCardFromField(Convert.ToInt32(split[i]));
        }
    }
}

2 个答案:

答案 0 :(得分:3)

这应该这样做:

var firstKeysOfDupeValues = myDict
    .GroupBy(x => x.Value)
    .SelectMany(x => x.Reverse().Skip(1))
    .Select(p => p.Key);
    .ToList();

按值分组后,使用.Reverse().Skip(1)拒绝每个值组的最后一个键(此构造具有双重任务:它还拒绝非重复值的单个键)和剩余键的键/值对被提取到结果中。

答案 1 :(得分:1)

您可以使用

var allButLastDupKeys = myDict.GroupBy(kv => kv.Value)
    .Where(g => g.Count() > 1)
    .SelectMany(g => g.Take(g.Count() - 1).Select(kv => kv.Key));
string dupKeys = string.Join(",", allButLastDupKeys); // 0,1,4