Distinct (Linq)在int[]列表中不起作用的原因是因为int[]列表是一个值类型数组,而Distinct方法是基于对象的引用进行比较的。在C#中,值类型的比较是基于值本身进行的,而不是基于引用。因此,对于int[]列表,Distinct方法无法正确识别和去重重复的元素。
要解决这个问题,可以使用重载的Distinct方法,该方法接受一个实现了IEqualityComparer<T>接口的对象,用于自定义比较规则。对于int[]列表,可以自定义一个比较器来实现按值比较的去重。
以下是一个示例代码,展示了如何使用自定义比较器来去重int[]列表:
using System;
using System.Collections.Generic;
using System.Linq;
public class IntArrayEqualityComparer : IEqualityComparer<int[]>
{
public bool Equals(int[] x, int[] y)
{
if (x == null && y == null)
return true;
if (x == null || y == null)
return false;
if (x.Length != y.Length)
return false;
for (int i = 0; i < x.Length; i++)
{
if (x[i] != y[i])
return false;
}
return true;
}
public int GetHashCode(int[] obj)
{
if (obj == null)
return 0;
int hash = 17;
foreach (int item in obj)
{
hash = hash * 23 + item.GetHashCode();
}
return hash;
}
}
public class Program
{
public static void Main()
{
int[] numbers1 = { 1, 2, 3, 4, 5 };
int[] numbers2 = { 1, 2, 3, 4, 5 };
int[] numbers3 = { 1, 2, 3, 4, 6 };
List<int[]> list = new List<int[]> { numbers1, numbers2, numbers3 };
var distinctList = list.Distinct(new IntArrayEqualityComparer());
foreach (var numbers in distinctList)
{
Console.WriteLine(string.Join(", ", numbers));
}
}
}
在上述示例中,我们定义了一个IntArrayEqualityComparer类,实现了IEqualityComparer<int[]>接口。Equals方法用于比较两个int[]数组是否相等,GetHashCode方法用于获取数组的哈希码。然后,在使用Distinct方法时,传入自定义的比较器对象。
这样,就可以正确地去重int[]列表中的重复元素了。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云