当前位置: 代码迷 >> C# >> 这个相等比较器为什么报错?该怎么处理
  详细解决方案

这个相等比较器为什么报错?该怎么处理

热度:341   发布时间:2016-05-05 05:15:14.0
这个相等比较器为什么报错?

class Program
{
    static void Main(string[] args)
    {

        List<string> list1 = new List<string>() { "1", "2", "3" };
        List<string> list2 = new List<string>() { "2", "1", "3" };
        bool b = Enumerable.SequenceEqual(list1, list2,new MyEqualityComparer()); //报错
        Console.ReadKey();
    }
}
class MyEqualityComparer : IEqualityComparer<List<string>>  //自定义相等比较器
{
    public bool Equals(List<string> list1, List<string> list2)
    {
        return string.Join(",", list1.OrderBy(x => x).ToArray()) == string.Join(",", list2.OrderBy(x => x).ToArray());
    }
    public int GetHashCode(List<string> list)
    {
        return string.Join(",", list.OrderBy(x => x).ToArray()).GetHashCode();
    }
}


在上面的代码中,为什么报错呢?
错误 1 无法从用法中推理出方法“System.Linq.Enumerable.SequenceEqual<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEqualityComparer<TSource>)”的类型参数。请尝试显式指定类型参数。

这是什么意思?

------解决思路----------------------
//
        // 摘要:
        //     使用指定的 System.Collections.Generic.IEqualityComparer<T> 对两个序列的元素进行比较,以确定序列是否相等。
        //
        // 参数:
        //   first:
        //     一个用于比较 second 的 System.Collections.Generic.IEnumerable<T>。
        //
        //   second:
        //     一个 System.Collections.Generic.IEnumerable<T>,用于与第一个序列进行比较。
        //
        //   comparer:
        //     一个用于比较元素的 System.Collections.Generic.IEqualityComparer<T>。
        //
        // 类型参数:
        //   TSource:
        //     输入序列中的元素的类型。
        //
        // 返回结果:
        //     如果根据 comparer,两个源序列的长度相等,且其相应元素相等,则为 true;否则为 false。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     first 或 second 为 null。
        public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer);


这个方法的三个参数都是TSource,你传入的两个前面两个TSource为string,第三个TSource为List<string>
------解决思路----------------------
而且根据返回结果备注,你根本需要第三个比较参数
------解决思路----------------------
// 返回结果:
        //     如果根据 comparer,两个源序列的长度相等,且其相应元素相等,则为 true;否则为 false。
        //


根据返回说明,你根本不需要IEqualityComparer参数
------解决思路----------------------
请注意对比请求参数
this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer
//与你的对比
List<string>,List<string>,IEqualityComparer<List<string>>
 

TSource     TSource    TSource
string          string         List~string

------解决思路----------------------
IEnumerable<TSource>
List<string>

请求参数是IEnumerable,对应List
------解决思路----------------------
IEnumerable本身就是List,List内的类型才是你需要告诉它的
------解决思路----------------------
List<List<string>> 才可以
------解决思路----------------------
引用:

class Program
{
    static void Main(string[] args)
    {

        List<string> list1 = new List<string>() { "1", "2", "3" };
        List<string> list2 = new List<string>() { "2", "1", "3" };
        bool b = Enumerable.SequenceEqual(list1, list2,new MyEqualityComparer()); //报错
        Console.ReadKey();
    }
}
class MyEqualityComparer : IEqualityComparer<List<string>>  //自定义相等比较器
{
    public bool Equals(List<string> list1, List<string> list2)
    {
        return string.Join(",", list1.OrderBy(x => x).ToArray()) == string.Join(",", list2.OrderBy(x => x).ToArray());
    }
    public int GetHashCode(List<string> list)
    {
        return string.Join(",", list.OrderBy(x => x).ToArray()).GetHashCode();
    }
}


在上面的代码中,为什么报错呢?
错误 1 无法从用法中推理出方法“System.Linq.Enumerable.SequenceEqual<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEqualityComparer<TSource>)”的类型参数。请尝试显式指定类型参数。

这是什么意思?

 List<string> list1 = new List<string>() { "1", "2", "3" };
            list1 = (from p in list1 orderby p descending select p).ToList();
            List<string> list2 = new List<string>() { "1", "3", "2" };
            list2 = (from p in list2 orderby p descending select p).ToList();
            bool b = list1.SequenceEqual(list2);
  相关解决方案