最有效的方法来比较两个List <t>

时间:2015-09-16 18:32:58

标签: c# performance

我正在尝试比较两个列表。这是我正在尝试使用的扩展方法:

public static bool EqualsAll<T>(this IList<T> a, IList<T> b)
{
    if (a == null || b == null)
        return (a == null && b == null);

    if (a.Count != b.Count)
        return false;

    EqualityComparer<T> comparer = EqualityComparer<T>.Default;

    for (int i = 0; i < a.Count; i++)
    {
        if (!comparer.Equals(a[i], b[i]))
            return false;
    }

    return true;
}

我已经问过这个问题here。但我需要更多相关信息。回答者说最好使用SequenceEqual代替for循环。

现在我的问题是,两种方法中的哪一种是比较两种List<T>的最有效方式?

3 个答案:

答案 0 :(得分:6)

我确定他们的表现都相对平等,因为他们都在进行序列相等的检查。 SequenceEqual没有任何魔法 - 它仍然循环。

至于使用哪一个,请使用SequenceEqual - 它内置于框架中,其他程序员已经知道它的功能,最重要的是,没有必要重新发明轮子。

答案 1 :(得分:3)

正如IList<T>实施IEnumerable<T>,正如文件here所述,我相信

a.SequenceEqual(b)

是进行比较的合理方法,其中记录了exntsion方法here

答案 2 :(得分:3)

List<T>对象进行比较的最有效方法是不使用IList进行接口调度。相反,将类型专门化为List<T>。参数应为List<T>

这节省了大量的间接调用。它显然比基于IEnumerable的{​​{1}}更快,而每个元素需要两次间接调用。

此外,您需要缓存计数。

最好是SequenceEquals有内置方法,或者实现某个接口或允许访问其内部缓冲区。但这些都不可用。

我想最快的方法是运行时编译一个函数,该函数返回每个列表的内部缓冲区。然后,您可以比较更快的数组。显然,这依赖于完全信任和无证内部......继续保持谨慎。

您还可以采取一些措施来避免比较器的成本。这真的取决于这个问题的重要性。你可以花很长时间来优化它。