如何比较两个列表<;字符串>;彼此之间

本文关键字:lt 字符串 彼此之间 gt 列表 何比较 比较 两个 | 更新日期: 2023-09-27 18:26:58

假设有

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

有办法这样做吗?

if (a1 == a2) 
{
}

如何比较两个列表<;字符串>;彼此之间

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

if (a1.SequenceEqual(a2))

在线查看:ideone

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

IEnumerable<string> inFirstOnly = a1.Except(a2);
IEnumerable<string> inSecondOnly = a2.Except(a1);
bool allInBoth = !inFirstOnly.Any() && !inSecondOnly.Any();

因此,如果顺序和重复次数无关紧要(与接受答案的SequenceEqual相反),这是一种有效的方法。演示:Ideone

如果你想以一种不区分大小写的方式进行比较,只需添加StringComparer.OrdinalIgnoreCase:

a1.Except(a2, StringComparer.OrdinalIgnoreCase)

我发现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只蜱虫

在Core i7-920上使用Visual Studio 2010 C#.NET 4客户端配置文件进行测试

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

您可以通过以下所有方式查看列表

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