C# 比较两个不按顺序排列的列表';没关系,使用iQualityComparer
我想检查两个列表是否包含相同的项目。项目的顺序无关紧要,相同的项目可能会在每个列表中出现两次 例如:C# 比较两个不按顺序排列的列表';没关系,使用iQualityComparer,c#,linq,C#,Linq,我想检查两个列表是否包含相同的项目。项目的顺序无关紧要,相同的项目可能会在每个列表中出现两次 例如: var List1 = new List<int> { 1, 2, 2 }; var List2 = new List<int> { 2, 1, 2 }; //equal var List1 = new List<int> { 1, 2, 2 }; var List2 = new List<int> { 2, 1, 1 }; //not equa
var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 2 };
//equal
var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 1 };
//not equal - different quantities of 1s and 2s in the two lists
但是,现在我需要为这两个项目使用
IEqualityComparer
,而Remove
无法接受。有人能想出一个解决这个问题的有效办法吗?如果它接受的是IEnumerable
而不是列表
,那么它也会很有用。试试看,这应该适合您的情况:
return ListA.OrderBy(x => x).SequenceEqual(ListB.OrderBy(x => x));
只是一个临时订单,然后进行比较尝试此操作应适用于您的情况:
return ListA.OrderBy(x => x).SequenceEqual(ListB.OrderBy(x => x));
只是一个临时订单,然后比较您可能会使用的解决方案是:
var list1=新列表{1,2,2};
var list2=新列表{1,1,2};
var list1Distinct=list1.Distinct();
var list2Distinct=list1.Distinct();
var allDistinctValues=list1.Intersect(list2);
bool listsEqual=true;
foreach(所有distinct值中的int i)
{
int list1Count=0;
int list2Count=0;
list1Count=list1.Count(val=>val==i);
list2Count=list2.Count(val=>val==i);
if(list1Count!=list2Count)
{
listsEqual=false;
}
}
如果(!listsEqual)
{
//列表项计数不相同
}
您可以使用的解决方案是:
var list1=新列表{1,2,2};
var list2=新列表{1,1,2};
var list1Distinct=list1.Distinct();
var list2Distinct=list1.Distinct();
var allDistinctValues=list1.Intersect(list2);
bool listsEqual=true;
foreach(所有distinct值中的int i)
{
int list1Count=0;
int list2Count=0;
list1Count=list1.Count(val=>val==i);
list2Count=list2.Count(val=>val==i);
if(list1Count!=list2Count)
{
listsEqual=false;
}
}
如果(!listsEqual)
{
//列表项计数不相同
}
您可以尝试的另一个选项是:
var lookup1 = List1.ToLookup(x => x);
var lookup2 = List2.ToLookup(x => x);
return lookup1.Count == lookup2.Count && lookup1.All(x => lookup2[x.Key].SequenceEqual(x));
这不需要完全排序,可能会更快地返回结果。您可以尝试的另一个选项是:
var lookup1 = List1.ToLookup(x => x);
var lookup2 = List2.ToLookup(x => x);
return lookup1.Count == lookup2.Count && lookup1.All(x => lookup2[x.Key].SequenceEqual(x));
这不需要进行完全排序,而且可能会更快地返回结果。您能先对列表排序吗?然后你可以做一个普通的?为什么不使用收集(
List
)的.Contains()
方法?看看this@R.Garc“因为第一个例子,a不起作用。”@VanVO Nope。只有当同一个列表中的两个项目不相等时,这种方法才有效。您可以先对列表进行排序吗?然后你可以做一个普通的?为什么不使用收集(List
)的.Contains()
方法?看看this@R.Garc“因为第一个例子,a不起作用。”@VanVO Nope。只有当同一个列表中的两个项目不相等时,这种方法才有效。如果List2
的键比List1
的键多,则需要同时进行检查。@LasseVågsætherKarlsen-非常好。现在,通过在开始时进行简单的.Count
比较,这是一个更好的解决方案。如果List2
的键比List1
的键多,则需要同时检查两种方式。@LasseVågsætherKarlsen-非常好。现在,通过在开始时进行简单的.Count
比较,这是一个更好的解决方案。除非它们是相同的,否则没有意义。