有没有办法比较C#中的两个列表?

时间:2013-07-04 07:36:53

标签: c#

我按照以下方式比较两个列表

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

有没有简单的方法可以做到这一点?我需要它用于重构目的。感谢

5 个答案:

答案 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);

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

答案 2 :(得分:3)

我认为最简单的方法是使用Enumerable.SequenceEqual方法。

  

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

bool equal = listOne.SequenceEqual(listTwo);

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

作为Tim pointed,如果您的商品未订购,则使用Except方法会更好。例如;

bool equal = !listTwo.Except(listOne).Any();

答案 3 :(得分:0)

假设您对订单不感兴趣,可以使用OrderBySequenceEqual

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

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