发现在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。 任何想法为什么?

+2

我假设你想要索引是''在第三行[2]。和字符串应该是'“”''不“''因为”'用于字符文字,而不是字符串文字。 – CodesInChaos 2011-04-14 13:00:38

你得到所有这三个原因是,列表中包含三个不同的字符串数组。他们两个正好有相同的内容,但它仍然是两个不同的阵列。

快速试图解决它可能看起来像这样:

首先创建一个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();