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

本文关键字:有效 方法 List 两个 比较 | 更新日期: 2023-09-27 18:12:59

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

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

我已经问过这个问题了。但我需要更多的信息。回答者说最好使用SequenceEqual而不是for循环。

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

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

我确信它们在性能上都是相对相等的,因为它们都在做序列相等检查。SequenceEqual没有任何魔力——它仍然在循环。

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

由于IList<T>实现了IEnumerable<T>,如本文所述,我认为

a.SequenceEqual(b)

是进行比较的合理方法,这里记录了扩展方法。

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

这节省了大量的间接调用。它明显比基于IEnumerableSequenceEquals快,但每个元素需要两次间接调用。

还需要缓存计数。

如果List<T>有一个内置的方法,或者实现了一个特定的接口,或者允许访问它的内部缓冲区,那将是最好的。但是这些都是不可能的。

我想最快的方法是运行时编译一个函数,返回每个列表的内部缓冲区。然后,您可以比较数组,这要快得多。显然,这依赖于完全信任和未记录的内部…小心行事

您还可以做一些事情来避免比较器的成本。这取决于这个问题有多重要。