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

时间:2008-10-21 20:32:50

标签: linq lambda linq-to-objects

我刚刚开始学习linq和lambda表达式,它们似乎非常适合在复杂的对象集合中查找重复项,但我有点困惑,希望有人可以帮助我回到路径上快乐的编码。

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

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

3 个答案:

答案 0 :(得分:9)

  • 解压缩层次结构
  • 将每个元素投影到其uniqueID属性
  • 将这些ID分组
  • 按照包含多个元素的组
  • 过滤组
  • 将每个组投影到组的密钥(返回uniqueID)
  • 枚举查询并将结果存储在列表中。

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()

答案 1 :(得分:2)

有一个linq运算符Distinct(),如果只需要id,它允许您过滤到一组不同的记录。如果您已将类设置为覆盖等于您或拥有IEqualityComparer,则可以直接调用Distinct扩展方法以从列表中返回唯一结果。作为额外的奖励,您还可以使用Union和Intersect方法在两个列表之间进行合并或过滤。

另一种选择是按ID分组,然后选择第一个元素。

var results = from item in list
              group item by item.id into g
              select g.First();

答案 2 :(得分:0)

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