繁体   English   中英

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

[英]Most efficient way to compare two List<T>

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

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>的最有效方法?

我确信它们在性能上都相对平等,因为它们都在进行序列相等检查。 SequenceEqual没有任何魔法 - 它仍然循环。

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

由于IList<T>实现IEnumerable<T> ,如此处所述 ,我相信

a.SequenceEqual(b)

这是一种合理的比较方法, 这里记录了exntsion方法。

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

这节省了大量的间接呼叫。 它显然比基于IEnumerableSequenceEquals更快,同时每个元素需要两次间接调用。

此外,您需要缓存计数。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM