我按照以下方式比较两个列表
var listOne = new List<int>{1,2,3,4,5};
var listTwo = new List<int>{1,2,3,4,5,7};
bool isEqual = false;
foreach (var item in listOne)
{
if(listTwo.Contains(item))
{
isEqual = true;
}
else
{
isEqual = false;
break;
}
}
if(listOne.Count == listTwo.Count && isEqual == true)
{
Console.WriteLine("Equal list");
}
else
{
Console.WriteLine("Not Equal list");
}
有没有简单的方法可以做到这一点?我需要它用于重构目的。感谢
答案 0 :(得分:11)
非常简单的方法
var listOne = new List<int>{1,2,3,4,5};
var listTwo = new List<int>{1,2,3,4,5,7};
if (listOne.SequenceEqual(listTwo))
{
Console.WriteLine("Equal list");
}
else
{
Console.WriteLine("Not Equal list");
}
如果订单无关紧要,那么解决方案将是
var listOne = new List<int>{1,2,3,4,5};
var listTwo = new List<int>{1,2,3,4,5,7};
if (listOne.OrderBy(m => m).SequenceEqual(listTwo.OrderBy(m => m)))
{
Console.WriteLine("Equal list");
}
else
{
Console.WriteLine("Not Equal list");
}
答案 1 :(得分:9)
如果您对同一订单不感兴趣,可以使用非常有效的Except
:
bool isEqual = !listOne.Except(listTwo).Any();
如果您想知道两者是否包含相同的项目(仍然忽略订单):
if (listOne.Count > listTwo.Count)
isEqual = !listOne.Except(listTwo).Any();
else
isEqual = !listTwo.Except(listOne).Any();
如果要检查两个列表是否包含相同顺序的相同项目:
bool isEqual = listOne.SequenceEqual(listTwo);
如果您使用自定义类型,则需要覆盖Equals
和GetHashCode
,否则您只需按引用进行比较。
答案 2 :(得分:3)
我认为最简单的方法是使用Enumerable.SequenceEqual
方法。
通过比较元素确定两个序列是否相等 通过对其类型使用默认的相等比较器。
bool equal = listOne.SequenceEqual(listTwo);
SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
方法并行枚举两个源序列,并使用TSource
,Default
的默认相等比较器比较相应的元素。默认的相等比较器Default
用于比较实现IEqualityComparer<T>
通用接口的类型的值。
作为Tim pointed,如果您的商品未订购,则使用Except
方法会更好。例如;
bool equal = !listTwo.Except(listOne).Any();
答案 3 :(得分:0)
假设您对订单不感兴趣,可以使用OrderBy
和SequenceEqual
:
public static bool ListsEquals(List<int> listOne, List<int> listTwo)
{
if (listOne.Count != listTwo.Count)
return false;
if (!listOne.OrderBy(x => x).SequenceEqual(listTwo.OrderBy(x => x)))
return false;
}
或Intersect
:
public static bool ListsEquals(List<int> listOne, List<int> listTwo)
{
if (listOne.Count != listTwo.Count)
return false;
if (listOne.Intersect(listTwo).Count() != listOne.Count)
return false;
return true;
}
或Except
和Any
public static bool ListsEquals(List<int> listOne, List<int> listTwo)
{
if (listOne.Count != listTwo.Count)
return false;
if (!listOne.Except(listTwo).Any())
return false;
return true;
}
答案 4 :(得分:0)
如果列表中的项目顺序很重要,您可以在此处使用SequenceEqual
尽可能多的建议。
如果订单无关紧要,您应该先对列表进行排序,然后在排序前检查它们的数量,以避免排序和比较是否有不同的大小:
var listOne = new List<int>{1,2,3,4,5};
var listTwo = new List<int>{1,2,3,4,5,7};
var equal = (listOne.Count == listTwo.Count);
if (equal)
{
listOne.Sort();
listTwo.Sort();
equal = listOne.SequenceEqual(listTwo)
}
if (equal)
{
Console.WriteLine("Equal list");
}
else
{
Console.WriteLine("Not Equal list");
}