2009-10-27 52 views
14

这应该很容易。LINQ:检查两个列表是否相同

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

重复的元素被认为是平等的,IEE,new[]{1,2,2}new[]{2,1}

+0

@ 280Z28:所以你因为答案而拒绝了一个问题?听起来不太合理。 – Graviton 2009-10-27 06:15:10

+0

@Ngu,感谢您的澄清。 – 2009-10-27 06:18:44

+1

HashSet的SetEquals最适合检查两个集合是否与此问题中定义的相同 – Lijo 2012-12-02 09:25:13

回答

28
var same = list1.Except(list2).Count() == 0 && 
      list2.Except(list1).Count() == 0; 
+2

好吧,我忘了第二位,不需要downvote ... – leppie 2009-10-27 04:54:17

+1

什么是不同的重复? – leppie 2009-10-27 06:00:56

+11

甚至更​​“linq-ish”版本:'!list1.Except(list2).Any()&&!list2.Except(list1)。任何()' – TLS 2012-01-13 21:08:18

1

你需要获取两个列表的交集是相同的:

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

在回答你的问题修改:

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

我认为我的问题没有清晰表达......我修改了问题 – Graviton 2009-10-27 03:54:58

+0

如果't1'为{1,2,2 }和't2'为{1,2,2},这将错误地返回false。 – 2009-10-27 04:42:23

0

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

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

编辑:前OP补充说{1,2,2}等于{1,1,2}(关于重复条目的处理)将其写入。

只要元素在订单上具有可​​比性,就可以工作。

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

这不会帮助重复。 – leppie 2009-10-27 04:29:41

+0

@leppie:你是什么意思?如果'list1'包含4'3',那么'equal'只有当'list2'也包含4'3'时才是真的。重复工作正常。 – 2009-10-27 04:33:03

+0

如果顺序的顺序相同,您可以取出OrderBy调用;例如当您比较测试的出现列表时。 – Jason 2009-10-27 04:35:42

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

REFERENCE定义两组是否相等:

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

使用HashSets似乎是最优雅的方式来做到这一点(也可能相当快)。 – ThisGuy 2013-12-22 06:14:18