簡體   English   中英

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

[英]find distinct element in list in 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();

當您僅使用其中一個維度時,為什么在這里具有二維數組?

您的代碼應如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM