gpt4 book ai didi

c# - 测试两个 IEnumerable 是否具有相同频率的相同值

转载 作者:可可西里 更新时间:2023-11-01 08:18:33 25 4
gpt4 key购买 nike

我有两个多重集,都是 IEnumerables,我想比较它们。

string[] names1 = { "tom", "dick", "harry" };
string[] names2 = { "tom", "dick", "harry", "harry"};
string[] names3 = { "tom", "dick", "harry", "sally" };
string[] names4 = { "dick", "harry", "tom" };

希望 names1 == names4 返回 true(显然 self == self 返回 true)
但所有其他组合都返回 false。

什么是最有效的方法?这些可以是大量的复杂对象。

我看着做:
var a = name1.orderby<MyCustomType, string>(v => v.Name);
var b = name4.orderby<MyCustomType, string>(v => v.Name);

return a == b;

最佳答案

首先像你已经做的那样排序,然后使用 Enumerable.SequenceEqual .如果您的类型实现了 IEquatable<MyCustomType>,则可以使用第一个重载或覆盖 Equals ;否则你将不得不使用第二种形式并提供你自己的 IEqualityComparer<MyCustomType> .

因此,如果您的类型确实实现了相等性,只需执行以下操作:

return a.SequenceEqual(b);

这是另一个更快、更安全且不需要排序的选项:

public static bool UnsortedSequencesEqual<T>(
this IEnumerable<T> first,
IEnumerable<T> second)
{
return UnsortedSequencesEqual(first, second, null);
}

public static bool UnsortedSequencesEqual<T>(
this IEnumerable<T> first,
IEnumerable<T> second,
IEqualityComparer<T> comparer)
{
if (first == null)
throw new ArgumentNullException("first");

if (second == null)
throw new ArgumentNullException("second");

var counts = new Dictionary<T, int>(comparer);

foreach (var i in first) {
int c;
if (counts.TryGetValue(i, out c))
counts[i] = c + 1;
else
counts[i] = 1;
}

foreach (var i in second) {
int c;
if (!counts.TryGetValue(i, out c))
return false;

if (c == 1)
counts.Remove(i);
else
counts[i] = c - 1;
}

return counts.Count == 0;
}

关于c# - 测试两个 IEnumerable<T> 是否具有相同频率的相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4576723/

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