如何将两个List <String>相互比较?

Dev*_*per 70 .net c#

让我们说有

List<string> a1 = new List<string>();

List<string> a2 = new List<string>();
Run Code Online (Sandbox Code Playgroud)

有没有办法这样做?

if (a1 == a2) 
{

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 131

如果要检查列表中的元素是否相同且顺序相同,可以使用SequenceEqual:

if (a1.SequenceEqual(a2))
Run Code Online (Sandbox Code Playgroud)

看到它在线工作:ideone


Tim*_*ter 14

您还可以使用Except(生成两个序列的集合差异)来检查是否存在差异:

IEnumerable<string> difference = a1.Except(a2);
if(!difference.Any()){}
Run Code Online (Sandbox Code Playgroud)

  • 使用`Except`的两个潜在问题:它只返回`a2`中不存在的'a1`项 - 所以如果`a2`包含额外的项,这将返回假阴性.其次,它没有考虑同一项目的重复,只考虑存在.仍然是一个强大的工具,只需要小心使用. (7认同)
  • @AndrewHanlon:我想起了这个答案和你的评论,所以我添加了一些额外的信息和一种双向检查的方法 - 8.5 年后:D (6认同)

JYe*_*ton 11

我发现这SequenceEqual不是比较两个字符串列表的最有效方法(最初来自http://www.dotnetperls.com/sequenceequal).

我想自己测试一下,所以我创建了两个方法:

    /// <summary>
    /// Compares two string lists using LINQ's SequenceEqual.
    /// </summary>
    public bool CompareLists1(List<string> list1, List<string> list2)
    {
        return list1.SequenceEqual(list2);
    }

    /// <summary>
    /// Compares two string lists using a loop.
    /// </summary>
    public bool CompareLists2(List<string> list1, List<string> list2)
    {
        if (list1.Count != list2.Count)
            return false;

        for (int i = 0; i < list1.Count; i++)
        {
            if (list1[i] != list2[i])
                return false;
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

第二种方法是我遇到的一些代码,并想知道它是否可以重构为"更容易阅读".(并且还想知道LINQ优化是否会更快.)

事实证明,有两个包含32k字符串的列表,超过100个执行:

  • 方法1平均得到6761.8个滴答
  • 方法2平均采用3268.4滴答

为了简洁,性能和代码可读性,我通常更喜欢LINQ; 但在这种情况下,我认为基于循环的方法是首选.

编辑:

我使用优化代码重新编译,并运行测试1000次迭代.结果仍然有利于循环(更是如此):

  • 方法1平均采用4227.2滴答
  • 方法2平均采用1831.9滴答

使用Visual Studio 2010,Core i7-920上的C#.NET 4 Client Profile进行测试