gpt4 book ai didi

c# - 测试有序大型集合不等式的算法

转载 作者:太空狗 更新时间:2023-10-29 22:37:05 26 4
gpt4 key购买 nike

好的,我需要测试两个 IEnumerable<T>是平等的。元素的顺序很重要,这意味着:

{1, 2, 4, 1, 3} and {1, 2, 1, 3, 4} should not be equal.

我在这个网站上看到了一些解释如何用 linq 做到这一点的答案。 :例如,here

问题是我必须反复测试很可能不相等的相当大的集合(数千个元素)是否相等,因此性能是一个需要牢记的因素。在我看来,所有 linq如果我没记错的话,引用答案(CountExcept)中显示的方法需要遍历整个集合,这在一般情况下是没有必要的。

我想出了这个代码,它工作得相当好(我认为)并且速度足够快。我想知道我是否遗漏了一些明显的内置方法(如果可能的话,我不想在这里重新发明轮子。)

 public static bool IsEqualTo<T>(this IEnumerable<T> inner, IEnumerable<T> other) where T: IEquatable<T>
{
if (inner == null)
throw new ArgumentNullException();

if (object.ReferenceEquals(inner, other))
return true;

if (object.ReferenceEquals(other, null))
return false;

using (var innerEnumerator = inner.GetEnumerator())
using (var otherEnumerator = other.GetEnumerator())
{
while (innerEnumerator.MoveNext())
{
if (!otherEnumerator.MoveNext() || !innerEnumerator.Current.Equals(otherEnumerator.Current))
return false;
}

return !otherEnumerator.MoveNext();
}
}

最佳答案

基本上,您希望在未找到元素时使计算短路。

IEnumerable.SequenceEqual ( MSDN ) 已经这样做了;通过以下实现证明:http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs (第 806 行)

当顺序很重要时,您应该能够编写一个简单的 while 循环:

int i = 0;
int aCount = a.Count(); //Use `IList` so you can use the property for efficiency
int bCount = b.Count(); //Use `IList` so you can use the property for efficiency

if (aCount != bCount)
return false;

while (a.ElementAt(i) == b.ElementAt(i))
i++;

return i == aCount;

您的函数基本上做同样的事情,并且可以正常工作。

关于c# - 测试有序大型集合不等式的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com