微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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();
    ,当您仅使用其中一个维度时,为什么在这里具有二维数组? 您的代码应如下所示:
 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();
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。