我正在尝试比较两个列表。这是我正在尝试使用的扩展方法:
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>
的最有效方式?
答案 0 :(得分:6)
我确定他们的表现都相对平等,因为他们都在进行序列相等的检查。 SequenceEqual
没有任何魔法 - 它仍然循环。
至于使用哪一个,请使用SequenceEqual
- 它内置于框架中,其他程序员已经知道它的功能,最重要的是,没有必要重新发明轮子。
答案 1 :(得分:3)
答案 2 :(得分:3)
与List<T>
对象进行比较的最有效方法是不使用IList
进行接口调度。相反,将类型专门化为List<T>
。参数应为List<T>
。
这节省了大量的间接调用。它显然比基于IEnumerable
的{{1}}更快,而每个元素需要两次间接调用。
此外,您需要缓存计数。
最好是SequenceEquals
有内置方法,或者实现某个接口或允许访问其内部缓冲区。但这些都不可用。
我想最快的方法是运行时编译一个函数,该函数返回每个列表的内部缓冲区。然后,您可以比较更快的数组。显然,这依赖于完全信任和无证内部......继续保持谨慎。
您还可以采取一些措施来避免比较器的成本。这真的取决于这个问题的重要性。你可以花很长时间来优化它。