LINQ:检查两个列表是否相同
这应该很容易 我想检查两个列表是否相同,它们是否包含所有相同的元素,顺序并不重要LINQ:检查两个列表是否相同,linq,Linq,这应该很容易 我想检查两个列表是否相同,它们是否包含所有相同的元素,顺序并不重要 重复的元素被认为是相等的,即,new[]{1,2,2}与new[]{2,1}您需要获得两个列表的交集: bool areIntersected = t1.Intersect(t2).Count() > 0; 在回答您被修改的问题时: bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() =
重复的元素被认为是相等的,即,
new[]{1,2,2}
与new[]{2,1}
您需要获得两个列表的交集:
bool areIntersected = t1.Intersect(t2).Count() > 0;
在回答您被修改的问题时:
bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() == 0;
如果list2中list1元素的计数等于list1中list2元素的计数,则两个列表都包含相同数量的元素,都是彼此的子集,换句话说,它们都包含相同的元素
if (list1.Count(l => list2.Contains(l)) == list2.Count(l => list1.Contains(l)))
return true;
else
return false;
Edit:这是在OP添加{1,2,2}等于{1,1,2}(关于重复条目的处理)之前编写的 只要元素在顺序上具有可比性,这将起作用
bool equal = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x));
of最适合于检查两个集合是否等于此问题中定义的集合
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);
stringA=“1,2,2”;
字符串stringB=“2,1”;
HashSet setA=newhashset((stringA.Trim()).Split(“,”).Select(t=>t.Trim());
HashSet setB=newhashset((stringB.Trim()).Split(',).Select(t=>t.Trim());
bool-isSetsEqual=setA.SetEquals(setB);
参考:
我想我的问题措辞不清楚。。。我已经修改了这个问题如果
t1
是{1,2,2}而t2
是{1,2,2},这将错误地返回false。这对重复项没有帮助。@leppie:你是什么意思?如果list1
包含43
,那么equal
只有在list2
也正好包含43
时才是真的。重复工作正常。如果序列的顺序相同,您可以执行OrderBy调用;例如,当您比较测试中的出现列表时。@Jason:是的,但问题明确指出,您不能对元素的顺序进行任何假设。3个元素与10个元素的对比情况如何,所有元素都是“a”。什么是不同的副本?更“linq”的版本:!list1.Except(list2).Any()&&!list2.Except(list1.Any()
@TLS),它不需要计算所有的差异,只需要计算第一个。@280Z28:所以你因为答案而否决了一个问题?听起来不太合理。@Ngu,谢谢你的澄清。HashSet的SetEquals最适合于检查两个集合是否相等,如本问题中所定义的。使用HashSet似乎是最优雅的方法(可能也很快)
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);