4

我通过以下方式比较两个列表:

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

有什么简单的方法可以做到这一点?

4

5 回答 5

17

非常简单的方法

    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");
        }
于 2013-07-04T07:37:41.407 回答
12

如果您对相同的订单不感兴趣,可以使用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);

如果您使用自定义类型,则需要覆盖Equalsand GetHashCode,否则您只需通过引用进行比较。

于 2013-07-04T07:39:37.237 回答
4

我相信最简单的方法是使用Enumerable.SequenceEqual方法。

通过使用其类型的默认相等比较器比较元素来确定两个序列是否相等。

bool equal = listOne.SequenceEqual(listTwo);

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)方法并行枚举两个源序列,并使用默认的相等比较器比较对应的元素TSource, Default。默认的相等比较器 ,Default用于比较实现IEqualityComparer<T>泛型接口的类型的值。

正如蒂姆指出的那样,如果您的物品没有订购,使用Except方法看起来会更好。例如;

bool equal = !listTwo.Except(listOne).Any();
于 2013-07-04T07:39:39.783 回答
0

假设您对订单不感兴趣,您可以使用OrderByand 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;
}

或者ExceptAny

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;
}
于 2013-07-04T07:44:29.920 回答
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");
}
于 2013-07-04T07:47:54.913 回答