【问题标题】:Retrieving non-duplicates from 2 Collections using LINQ使用 LINQ 从 2 个集合中检索非重复项
【发布时间】:2016-01-14 06:44:48
【问题描述】:

背景:我有两个具有不同名称属性(两个字符串)的不同类型对象的集合。 Collection1 中的对象有一个名为 Name 的字段,Collection2 中的对象有一个名为 Field 的字段。
我需要比较这两个属性,并根据该字符串属性从Collection1 获取项目,其中Collection2 中没有匹配项(Collection1 总是有更多或相同数量的项目。所有项目都应该有一个完成时按Collection2 中的名称/字段匹配项目)。

问题:我使用 Lists 找到了答案,它们对我有所帮助(对于它的价值,我正在使用 Collections)。我确实找到了似乎对我有用的this answer,但是我想将我所做的从查询语法(如果这就是所谓的?)转换为 LINQ 查询。见下文:

//Query for results. This code is what I'm specifically trying to convert.
var result = (from item in Collection1
              where !Collection2.Any(x => x.ColumnName == item.FieldName)
              select item).ToList();  

//** Remove items in result from Collection1**
//...

我真的一点都不熟悉这两种语法(正在研究它),但我想我大体上理解它在做什么。我正在努力尝试将其转换为 LINQ 语法,我想学习这两个选项而不是某种嵌套循环。

Collection1 中删除查询结果后的最终目标:Collection1.Count == Collection2 并且对于集合中的每个项目,以下内容都是正确的:ItemFromCollection1.Name == SomeItemFromCollection2.Field(如果有意义的话...)

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以像这样将其转换为 LINQ 方法:

    var result = Collection1.Where(item => !Collection2.Any(x => x.ColumnName == item.FieldName))
                            .ToList();  
    

    【讨论】:

    • 太棒了,完美运行。现在我只需要研究它与另一个相比......
    【解决方案2】:

    您的第一个查询与您的要求相反。它正在查找没有等价物的记录。以下将返回 Collection1 中存在等效项的所有记录:

     var results=Collection1.Where(c1=>!Collection2.Any(c2=>c2.Field==c1.Name));
    

    请注意,这不是最快的方法,尤其是当 collection2 中有大量记录时。您可以通过 HashSets 或 Lookups 找到加速它的方法。

    【讨论】:

    • 你是对的。我会尝试清理我的帖子。我正在做的是查找不匹配的内容,然后稍后将其删除。
    • 这是我的一个误会。您需要更改为 ...c1=>!Collection2.Any... 以获取非骗子。我并不担心大量的记录。平均应该在 15 左右。绝对不超过一百个左右。
    • 编辑答案以反映获得非重复而不是重复。
    【解决方案3】:

    如果您想获取要保留的非重复值列表,请执行以下操作。

    List<string> listNonDup = new List<String>{"6","1","2","4","6","5","1"};
    var singles = listNonDup.GroupBy(n => n)
                 .Where(g => g.Count() == 1)
                 .Select(g => g.Key).ToList();
    

    产量:2、4、5

    如果你想要一个所有重复值的列表,那么你可以做相反的事情

    var duplicatesxx = listNonDup.GroupBy(s => s)
        .SelectMany(g => g.Skip(1)).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多