【问题标题】:LINQ: check whether two list are the sameLINQ:检查两个列表是否相同
【发布时间】:2009-10-27 03:42:46
【问题描述】:

这应该很容易。

我想检查两个列表是否相同,因为它们包含所有相同的元素,顺序并不重要。

重复的元素被认为是相等的,即new[]{1,2,2}new[]{2,1}相同

【问题讨论】:

  • @280Z28:所以你因为答案而否决了一个问题?听起来不太合理。
  • @Ngu,感谢您的澄清。
  • HashSet 的 SetEquals 最适合检查本问题中定义的两个集合是否相等

标签: linq


【解决方案1】:
var same = list1.Except(list2).Count() == 0 && 
           list2.Except(list1).Count() == 0;

【讨论】:

  • 什么是不同的重复项?
  • 一个更“linq-ish”的版本:!list1.Except(list2).Any() && !list2.Except(list1).Any()
  • @TLS 它不需要计算所有差异,只需计算第一个差异。
【解决方案2】:

编辑:这是在 OP 添加 { 1, 2, 2 } 等于 { 1, 1, 2 } 之前编写的(关于重复条目的处理)。

只要元素的顺序是可比的,这将起作用。

bool equal = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x));

【讨论】:

  • 这对复制没有帮助。
  • @leppie:你什么意思?如果list1 包含 4 个3,那么只有当list2 也恰好包含 4 个3 时,equal 才会为真。重复工作正常。
  • 如果序列的顺序相同,您可以取出 OrderBy 调用;例如当您比较测试中的出现列表时。
  • @Jason:是的,但问题明确指出你不能假设任何关于元素的顺序。
  • 那么 3 个元素对 10 个元素呢,所有元素都是 'a'。
【解决方案3】:

HashSetSetEquals 最适合检查本问题中定义的两组是否相等

        string stringA = "1,2,2";
        string stringB = "2,1";

        HashSet<string> setA = new HashSet<string>((stringA.Trim()).Split(',').Select(t => t.Trim()));
        HashSet<string> setB = new HashSet<string>((stringB.Trim()).Split(',').Select(t => t.Trim()));

        bool isSetsEqual = setA.SetEquals(setB);

参考:

  1. Check whether two comma separated strings are equal (for Content set)

【讨论】:

  • 使用 HashSets 似乎是最优雅的方法(而且可能也很快。)
【解决方案4】:

你需要得到两个列表的交集:

bool areIntersected = t1.Intersect(t2).Count() > 0;

回复您修改后的问题:

bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() == 0;

【讨论】:

  • 我认为我的问题措辞不明确......我已经修改了问题
  • 如果 t1 是 { 1, 2, 2 } 并且 t2 是 { 1, 2, 2 },这将错误地返回 false。
【解决方案5】:

如果 list2 中 list1 元素的计数等于 list1 中 list2 元素的计数,则两个列表都包含相同数量的元素,都是彼此的子集 - 换句话说,它们都包含相同的元素。

if (list1.Count(l => list2.Contains(l)) == list2.Count(l => list1.Contains(l)))
    return true;
else
    return false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2012-01-10
    • 2013-04-16
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多