【问题标题】:How to delete an item from a Dictonary using LINQ in C#如何在 C# 中使用 LINQ 从字典中删除项目
【发布时间】:2010-06-30 06:27:32
【问题描述】:

我需要从字典中删除特定项目..

字典就像

      dict["Key1"]="Value1"
      dict["Key2"]="Value2"
      dict["Key3"]="Value3"
      dict["Key4"]="Value2"

如果另一个项目具有相同的值,如何使用 LINQ 删除该项目

提前致谢

【问题讨论】:

  • 您要删除哪一项,是Key2的还是Key4的?
  • 检查更新的答案

标签: c# linq


【解决方案1】:

这是我测试过的解决方案:

dict.GroupBy(x => x.Value, x => x.Key)
.Where(x => x.Count() > 1)
.SelectMany(x => x.Skip(1))
.ToList().ForEach(x => dict.Remove(x))

【讨论】:

  • 这个答案其实很聪明。不知道采用“选择此”参数的 GroupBy。
【解决方案2】:

查看@Jon Skeet 的原始答案:C#: Remove duplicate values from dictionary?

var uniqueValues = myDict.GroupBy(pair => pair.Value)
                         .Select(group => group.First())
                         .ToDictionary(pair => pair.Key, pair => pair.Value);

【讨论】:

    【解决方案3】:
    var dupKeys = dict.GroupBy(innerD => innerD.Value)
                    .Where(mergedByValue => mergedByValue.Count() > 1)
                    .Select(mergedByValue => mergedByValue.OrderByDescending(m => m.Key).First().Key);
    
    dict.Where(d => dupKeys.Contains(d.Key)).ToList()
      .ForEach(d => dict.Remove(d.Key));
    

    这假设您希望删除 last 重复项,其中 last 定义为最后一个序号字符串值。

    如果您想删除 所有 个重复项,请将您的 dupKeys 更改为:

    var dupKeys = dict.GroupBy(innerD => innerD.Value)
                    .Where(mergedByValue => mergedByValue.Count() > 1).Dump()
                    .SelectMany(mergedByValue => mergedByValue.Select(m => m.Key));
    

    【讨论】:

      【解决方案4】:

      您需要使用Distinct

      【讨论】:

      • @Incognito:谢谢...你是对的,但我需要在创建字典后删除重复项。
      • & Pramodh,您不正确, distinct 不会帮助您根据对象的属性过滤集合并仍然使用关联的属性。
      • 您检查过链接吗?这不是 SQL 不同的。您可以在现有字典上使用它。
      • 是吗?现在尝试使用它来获取所有不同值的键。
      • @Graphain 我同意它为您提供了轻松获得不同值的方法。
      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2011-03-09
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多