加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Linq除了两个int数组列表

发布时间:2020-12-15 07:39:03 所属栏目:百科 来源:网络整理
导读:是否可以使用除了两个int数组列表,如下所示: Listint[] a = new Listint[](){ new int[]{3,4,5},new int[]{7,8,9},new int[]{10,11,12} };Listint[] b = new Listint[](){ new int[]{6,7,new int[]{3,41,12} };var c = a.Except(b); 并且考虑{3,5}不存在可
是否可以使用除了两个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,new int[]{3,41,12}  };

var c = a.Except(b);

并且考虑{3,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();
    }
}

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读