[英]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
- 它内置于框架中,其他程序员已经知道它的功能,最重要的是,没有必要重新发明轮子。
与List<T>
对象进行比较的最有效方法是不使用IList
进行接口调度。 相反,将类型专门化为List<T>
。 参数应该是List<T>
。
这节省了大量的间接呼叫。 它显然比基于IEnumerable
的SequenceEquals
更快,同时每个元素需要两次间接调用。
此外,您需要缓存计数。
如果List<T>
具有内置方法,或者实现某个接口或允许访问其内部缓冲区,那将是最好的。 但这些都不可用。
我想最快的方法是运行时编译一个函数,该函数返回每个列表的内部缓冲区。 然后,您可以比较更快的数组。 显然,这依赖于完全信任和无证内部......谨慎行事。
您还可以采取一些措施来避免比较器的成本。 这真的取决于这个问题的重要性。 您可以花很长时间来优化这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.