我有一个清单
List<string[]> finalResult = new List<string[]>();
包含
之后 finalResult[0][0]='After'
finalResult[1][0]='Before'
finalResult[2][0]='Before'
我想在此列表中找到许多不同的元素。 我正在使用
int noElements= finalResult.Distinct<string[]>().ToList().Count;
但它显示noElements = 3。 知道为什么吗?
答案 0 :(得分:2)
你得到这三个的原因是该列表包含三个不同的字符串数组。其中两个碰巧有相同的内容,但它仍然是两个不同的数组。
快速尝试解决它可能如下所示:
首先创建一个IEqualityComparer<string[]>
:
public class StringArrayComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (x==y)
{
return true;
}
if (x== null || y == null)
{
return false;
}
return x.Except(y).Count() == 0;
}
public int GetHashCode(string[] obj)
{
// there may be better implementations of GetHashCode
int sum = obj.Sum(s => s.GetHashCode());
return sum.GetHashCode();
}
}
...然后在调用Distinct
时使用该比较器:
var comparer = new StringArrayComparer();
int distinctCount = finalResult.Distinct(new StringArrayComparer()).Count();
答案 1 :(得分:2)
当你只使用其中一个尺寸时,为什么这里有一个二维数组呢?
您的代码应如下所示:
List<string> finalResult = new List<string>();
finalResult[0]="After";
finalResult[1]="Before";
finalResult[2]="Before";
然后你应该得到想要的结果
int noElements= finalResult.Distinct().Count(); //returns 2
答案 2 :(得分:2)
您需要传入IEqualityComparer对象,该对象指示如何比较字符串数组的distinct方法。
定义比较器:
public class MyComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] a, string[] b)
{
if (a.Length != b.Length ) return false;
for (int i = 0; i < a.Length;i++)
{
if (a[i] != b[i])
return false;
}
return true;
}
public int GetHashCode(string[] a)
{
return a.GetHashCode();
}
}
致电:
finalResult.Distinct(new MyComparer()).Count();