【问题标题】:C# Linq - Given two lists, how do I tell if either of them are contained in each otherC# Linq - 给定两个列表,我如何判断它们中的任何一个是否包含在彼此中
【发布时间】:2011-03-16 21:19:49
【问题描述】:

我有两个列表:

ListA:

"Brown"
"Green"
"Yellow"
"Orange"

ListB:

"Yellow"
"Orange"

如果 ListA 或 ListB 相互包含,我想返回 true。在这种情况下,ListB 是 ListA 的一部分。 ListB 不一定会更小。

我能想到的唯一解决方案是在两边都做 Union,即首先 ListA 和 ListB,然后 ListB 和 ListA,当且仅当两者都为 true 时才返回 true。

这是最好的方法,还有其他方法吗?

我希望有一个 Linq 解决方案

【问题讨论】:

  • 你的意思是列表中的元素是唯一的吗?是的,它们是唯一的字符串。
  • 我对 Linq 不够好,无法给出正确的答案,但大致如果两个列表的交集与较小的列表大小相同,则较小的列表包含在较大的列表中。我对使用 Linq 执行此操作没有信心的原因是,我总是不清楚使用 Intersect 是否会在您的列表中给出重复项或只是唯一项。如果您在任一列表中都没有重复项,那么您无需担心这一点。

标签: c# linq


【解决方案1】:

你可以试试:

int count = ListA.Intersect(ListB).Count();
if ((count == ListA.Count()) || (count == ListB.Count())) {
    // One list contains other
}

【讨论】:

  • 请注意,这仅在列表不包含重复元素的情况下按预期工作,并且 OP 已确认此处是这种情况。但是,如果您的列表确实可能包含欺骗,那么您就不能依赖这种技术。
  • 是的,如果我可以同时标记两个答案,我也会标记另一个,因为我相信会有其他人会更重视那个。
【解决方案2】:

检查a.Except(b)b.Except(a)是否为空。

【讨论】:

  • 并使用 Any() 扩展方法来检查它,而不是 Count() :-)(我个人正在努力教其他人使用 Any(),因为它是 O(1 ) 而不是 Count() 即 O(n))
  • 是比较空只是检查 0 大小还是有更合适的方法..让我搜索一下。
  • 您对与使用相交技巧相比的性能有何想法?我猜这会更快,因为使用 Any 它基本上会在它找到任何不在 b 中的 a 成员时返回(反之亦然)......
  • @xanatos:是的;我完全同意。 (但我忘了提)你也可以打电话给.Skip(x).Any()而不是.Count() > x
  • @Chris:但是,这涉及更多循环。我不知道。
【解决方案3】:

您可以使用intersect method 并检查结果集是否与任一集相同。

【讨论】:

  • 不“相同”。可能有重复的元素。并且新集的顺序不能和原集的顺序一样。
  • 当然。与对象不同。由于我们正在处理集合,因此您只需使用计数即可。
  • 嗯.. 如果这可行,那么我宁愿这样做。 Xanatos,元素是唯一的字符串。
猜你喜欢
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多