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

时间:2012-03-07 13:41:06

标签: c# .net

让我们说有

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

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

有没有办法这样做?

if (a1 == a2) 
{

}

5 个答案:

答案 0 :(得分:127)

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

if (a1.SequenceEqual(a2))

查看在线工作:ideone

答案 1 :(得分:13)

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

IEnumerable<string> difference = a1.Except(a2);
if(!difference.Any()){}

答案 2 :(得分: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;
    }

第二种方法是我遇到的一些代码,并想知道它是否可以重构为“更容易阅读”。 (并且还想知道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客户端配置文件进行测试

答案 3 :(得分:0)

    private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2)
    {
        if (dict1.Count != dict2.Count)
        {
            return false;
        }

        var keyDiff = dict1.Keys.Except(dict2.Keys);
        if (keyDiff.Any())
        {
            return false;
        }

        return (from key in dict1.Keys 
                let value1 = dict1[key] 
                let value2 = dict2[key] 
                select value1.Except(value2)).All(diffInValues => !diffInValues.Any());
    }

答案 4 :(得分:-1)

您可以检查以下列表中的所有方式

List<string> FilteredList = new List<string>();
//Comparing the two lists and gettings common elements.
FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase);