又是一个比较列表的问题。
List<MyType> list1;
List<MyType> list2;
我需要检查它们是否具有相同的元素,而不管它们在列表中的位置。每个MyType对象可以在列表中出现多次。是否有一个内置函数来检查这个?如果我保证每个元素在列表中只出现一次呢?
编辑:伙计们,谢谢你们的回答,但我忘了补充一些东西,每个元素的出现次数应该是相同的两个列表。
又是一个比较列表的问题。
List<MyType> list1;
List<MyType> list2;
我需要检查它们是否具有相同的元素,而不管它们在列表中的位置。每个MyType对象可以在列表中出现多次。是否有一个内置函数来检查这个?如果我保证每个元素在列表中只出现一次呢?
编辑:伙计们,谢谢你们的回答,但我忘了补充一些东西,每个元素的出现次数应该是相同的两个列表。
当前回答
这招对我很管用: 如果你正在比较依赖于单个实体(如ID)的两个对象列表,并且你想要匹配该条件的第三个列表,那么你可以执行以下操作:
var list3 = List1.Where(n => !List2.select(n1 => n1.Id).Contains(n.Id));
参考:MSDN - c#比较两个对象列表
其他回答
如果你不关心出现的次数,我会这样做。使用哈希集将比简单迭代提供更好的性能。
var set1 = new HashSet<MyType>(list1);
var set2 = new HashSet<MyType>(list2);
return set1.SetEquals(set2);
这将需要你重写. gethashcode()并在MyType上实现IEquatable<MyType>。
我用这个方法)
public delegate bool CompareValue<in T1, in T2>(T1 val1, T2 val2);
public static bool CompareTwoArrays<T1, T2>(this IEnumerable<T1> array1, IEnumerable<T2> array2, CompareValue<T1, T2> compareValue)
{
return array1.Select(item1 => array2.Any(item2 => compareValue(item1, item2))).All(search => search)
&& array2.Select(item2 => array1.Any(item1 => compareValue(item1, item2))).All(search => search);
}
这招对我很管用: 如果你正在比较依赖于单个实体(如ID)的两个对象列表,并且你想要匹配该条件的第三个列表,那么你可以执行以下操作:
var list3 = List1.Where(n => !List2.select(n1 => n1.Id).Contains(n.Id));
参考:MSDN - c#比较两个对象列表
认为这应该是你想要的:
list1.All(item => list2.Contains(item)) &&
list2.All(item => list1.Contains(item));
如果你想要它是不同的,你可以把它改为:
list1.All(item => list2.Contains(item)) &&
list1.Distinct().Count() == list1.Count &&
list1.Count == list2.Count
除了Guffa的答案之外,您还可以使用这个变体来获得更简洁的符号。
public static bool ScrambledEquals<T>(this IEnumerable<T> list1, IEnumerable<T> list2)
{
var deletedItems = list1.Except(list2).Any();
var newItems = list2.Except(list1).Any();
return !newItems && !deletedItems;
}