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

发布于 2024-07-06 21:52:20 字数 223 浏览 6 评论 0 原文

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

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

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

I've just started learning linq and lambda expressions, and they seem to be a good fit for finding duplicates in a complex object collection, but I'm getting a little confused and hope someone can help put me back on the path to happy coding.

My object is structured like list.list.uniqueCustomerIdentifier

I need to ensure there are no duplicate uniqueCustomerIdentifier with in the entire complex object. If there are duplicates, I need to identify which are duplicated and return a list of the duplicates.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

还在原地等你 2024-07-13 21:52:20
  • 解压缩层次结构
  • 将每个元素投影到其 uniqueID 属性 对
  • 这些 ID 进行
  • 分组 按具有超过 1 个元素的组过滤组
  • 将每个组投影到组的键(返回到 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()
  • Unpack the hierarchy
  • Project each element to its uniqueID property
  • Group these ID's up
  • Filter the groups by groups that have more than 1 element
  • Project each group to the group's key (back to uniqueID)
  • Enumerate the query and store the result in a list.

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()
好久不见√ 2024-07-13 21:52:20

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

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

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

There is a linq operator Distinct( ), that allows you to filter down to a distinct set of records if you only want the ids. If you have setup your class to override equals you or have an IEqualityComparer you can directly call the Distinct extension method to return the unique results from the list. As an added bonus you can also use the Union and Intersect methods to merge or filter between two lists.

Another option would be to group by the id and then select the first element.

var results = from item in list
              group item by item.id into g
              select g.First();
苍暮颜 2024-07-13 21:52:20

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

If you want to flatten the two list hierarchies, use the SelectMany method to flatten an IEnumerable<IEnumerable<T>> into IEnumerable<T>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文