在C#中查找列表中的不同元素

时间:2011-04-14 12:55:04

标签: 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。 知道为什么吗?

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();