gpt4 book ai didi

c# - 将 Linq Except 与两个 int 数组列表一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:04:18 24 4
gpt4 key购买 nike

是否可以将 except 与两个 int 数组列表一起使用,如下所示:

List<int[]> a = new List<int[]>(){ new int[]{3,4,5}, new int[]{7,8,9}, new int[]{10,11,12}  };

List<int[]> b = new List<int[]>(){ new int[]{6,7,9}, new int[]{3,4,5}, new int[]{10,41,12} };

var c = a.Except(b);

并期望 {3,4,5} 不存在于可枚举的 c 中?当然我试过了,但这个不起作用。有没有像 Except 一样高效的解决方案?或者更好、更快?

最佳答案

在 .NET 中,数组只有在完全相同的数组对象时才与另一个数组相等。因此,两个具有相同内容的不同数组不被认为是相等的:

int[] x = new int[] { 1, 2 };
int[] y = new int[] { 1, 2 };
Console.WriteLine(x == y); // false

为了根据内容检查相等性,您可以使用 Enumerable.SequenceEqual :

Console.WriteLine(x.SequenceEqual(y)); // true

当然,当您尝试使用 Enumerable.Except 时,这并不能直接帮助您,因为默认情况下它将使用默认的相等比较器,它只检查相等性(并且因为每个数组都与除自身之外的所有其他数组不相等……)。

所以解决方案是 use the other overload , 并提供自定义 IEqualityComparer它根据内容比较数组。

public class IntArrayEqualityComparer : IEqualityComparer<int[]>
{
public bool Equals(int[] a, int[] b)
{
return a.SequenceEqual(b);
}

public int GetHashCode(int[] a)
{
return a.Sum();
}
}

不幸的是,仅仅委托(delegate)给 SequenceEqual 是不够的。我们还必须提供一个 GetHashCode 实现来让它工作。作为一个简单的解决方案,我们可以在这里使用数组中数字的总和。通常,我们希望提供一个强大的散列函数,它可以告诉我们很多关于内容的信息,但由于我们只将这个散列函数用于 Except 调用,我们可以在这里使用一些简单的东西。 (通常,我们还希望避免从可变对象创建哈希值)

当使用相等比较器时,我们正确地过滤掉了重复的数组:

var c = a.Except(b, new IntArrayEqualityComparer());

关于c# - 将 Linq Except 与两个 int 数组列表一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250446/

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