【问题标题】:Looking for equals in nested collections在嵌套集合中寻找等于
【发布时间】:2017-11-06 16:47:16
【问题描述】:

我有两个 IEnumerable 集合(BaseCollectionA 和 BaseCollectionB)。

这些集合的项目是其他集合(SubCollectionA 和 SubCollectionB)。 SubCollections 中可以有一个或多个集合项(对象)。 SubCollections 包含具有我的属性的对象 (MyObject);

我想比较两个 BaseCollection 及其子集合的项目 (MyObjects) 的重复项,即当 BaseCollectionA 的任何子集合中的项目 (MyObject) 等于项目 (MyObject) 时返回 true ) 在 BaseCollectionB 的任何子集合中。

IEnumerable<T> BaseCollectionA
{
    IEnumerable<T> SubCollectionA1,
    IEnumerable<T> SubCollectionA2,
    IEnumerable<T> SubCollectionA3,
    ...
}

IEnumerable<T> BaseCollectionB
{
    IEnumerable<T> SubCollectionB1,
    IEnumerable<T> SubCollectionB2,
    IEnumerable<T> SubCollectionB3,
    ...
}

就我而言,性能非常重要,因此最好有最快的解决方案。另外,我更喜欢用方法语法编写 linq。

非常感谢。

【问题讨论】:

  • Stack Overflow不是免费的代码编写服务。您应该尝试自己编写代码。在doing more research 之后,如果您有问题,您可以发布您尝试过的内容,并清楚地解释什么不起作用,并提供一个minimal reproducible example 。我建议阅读How to Ask 一个好问题和the perfect question。另外,请务必使用tour
  • SelectMany 可能有用
  • 您的问题没有很好地说明。在要求其他人为您编写代码之前,请向我们展示您的代码。
  • 在什么意义上相等?通过引用还是通过一个或多个键匹配 MyObject 属性?

标签: c# linq


【解决方案1】:
var allTsInA = baseCollectionA.Concat(baseCollectionA.SubCollectionA1)
                              .Concat(baseCollectionA.SubCollectionA2)
                              .Concat(baseCollectionA.SubCollectionA3);

var allTsInB = /* same for B */;

var result = allTsInA.Any(allTsInB.Contains);

您可能希望通过使用字典或哈希集来改进这一点,而不是在多次重复时重新迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2010-09-21
    • 1970-01-01
    • 2014-05-18
    • 2019-12-31
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多