发现在C#
问题描述:
在列表中不同的元素我有一个列表发现在C#
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。 任何想法为什么?
答
你得到所有这三个原因是,列表中包含三个不同的字符串数组。他们两个正好有相同的内容,但它仍然是两个不同的阵列。
快速试图解决它可能看起来像这样:
首先创建一个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();
答
为什么你有一个2维数组这里,当你只使用其中一个维度?
您的代码应该是这样的:
List<string> finalResult = new List<string>();
finalResult[0]="After";
finalResult[1]="Before";
finalResult[2]="Before";
那么你应该得到想要的结果
int noElements= finalResult.Distinct().Count(); //returns 2
答
你需要,指示如何比较字符串的不同方法的的IEqualityComparer对象来传递阵列。
定义比较器:
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();
我假设你想要索引是''在第三行[2]。和字符串应该是'“”''不“''因为”'用于字符文字,而不是字符串文字。 – CodesInChaos 2011-04-14 13:00:38