使用Linq或Lambda表达式检查复杂对象中的重复项

4

我刚开始学习linq和lambda表达式,它们似乎非常适合在复杂对象集合中查找重复项,但我有些困惑,希望有人能够帮助我重新回到愉快编程的道路。

我的对象结构类似于list.list.uniqueCustomerIdentifier

我需要确保整个复杂对象中没有重复的uniqueCustomerIdentifier。如果有重复项,我需要确定哪些是重复的,并返回重复项的列表。

3个回答

9
  • 拆分层次结构
  • 将每个元素投影到其唯一ID属性上
  • 将这些ID分组
  • 过滤掉只有一个元素的组
  • 将每个组投影到组的键上(回到唯一ID)
  • 枚举查询并将结果存储在列表中。
var result = 
  myList
    .SelectMany(x => x.InnerList)
    .Select(y => y.uniqueCustomerIdentifier)
    .GroupBy(id => id)
    .Where(g => g.Skip(1).Any())
    .Select(g => g.Key)
    .ToList()

3
你可以跳过 .Select(y => y.uniqueCustomerIdentifier) 这一步,直接使用 .GroupBy(y => y.uniqueCustomerIdentifier) 进行分组。 - Lucas

2
有一个Linq操作符Distinct(),如果只想要ID,可以使用它来过滤出不同的记录集。如果你已经设置了类来重写equals或拥有一个IEqualityComparer,你可以直接调用Distinct扩展方法从列表中返回唯一的结果。作为额外的奖励,你还可以使用Union和Intersect方法在两个列表之间进行合并或筛选。
另一个选项是按ID分组,然后选择第一个元素。
var results = from item in list
              group item by item.id into g
              select g.First();

0
如果您想要展平两个列表层次结构,请使用 SelectMany 方法将 IEnumerable<IEnumerable<T>> 展平为 IEnumerable<T>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接