比较两个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>
最有效的方法?
我确信它们在性能上都是相对相等的,因为它们都在做序列相等检查。SequenceEqual
没有任何魔力——它仍然在循环。
至于使用哪一个,使用SequenceEqual
-它是内建在框架中,其他程序员已经知道它的功能,最重要的是,没有必要重新发明轮子
由于IList<T>
实现了IEnumerable<T>
,如本文所述,我认为
a.SequenceEqual(b)
是进行比较的合理方法,这里记录了扩展方法。
比较List<T>
对象的最有效方法是不通过使用IList
进行接口调度。相反,将该类型专门化为List<T>
。参数应为List<T>
。
这节省了大量的间接调用。它明显比基于IEnumerable
的SequenceEquals
快,但每个元素需要两次间接调用。
还需要缓存计数。
如果List<T>
有一个内置的方法,或者实现了一个特定的接口,或者允许访问它的内部缓冲区,那将是最好的。但是这些都是不可能的。
我想最快的方法是运行时编译一个函数,返回每个列表的内部缓冲区。然后,您可以比较数组,这要快得多。显然,这依赖于完全信任和未记录的内部…小心行事
您还可以做一些事情来避免比较器的成本。这取决于这个问题有多重要。