代码之家  ›  专栏  ›  技术社区  ›  josephj1989

使用lambda表达式的IComparer

  •  16
  • josephj1989  · 技术社区  · 15 年前
     class p {
         public string Name { get; set; }
         public int Age { get; set; }
     };
    
     static List<p> ll = new List<p>
     {
         new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20},
         new p{Name="Exab",Age=45},new p{Name="G123",Age=19}
     };
     protected static void SortList()
     {
         IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name);  <==(Line 1)
         ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2)
     }
    

    这里list.sort需要 IComparer<p> 作为参数。它和lambda一起工作 如第2行所示。但是当我尝试像第1行那样做时,我得到了这个错误:

    无法将lambda表达式转换为 类型 System.Collections.Generic.IComparer' 因为它不是委托类型

    我调查了一段时间,但还是不明白。也许我对我的理解不是很好。有人能帮我一把吗?

    4 回复  |  直到 10 年前
        1
  •  19
  •   BlueRaja - Danny Pflughoeft    12 年前

    当你这样做的时候 ll.Sort((x, y) => x.Name.CompareTo(y.Name)); 它使用过载 Comparison<T> 不是 IComparer . 比较<t> 是委托,因此可以对其使用lambda表达式。

    Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); 会工作。

        2
  •  5
  •   Community CDub    8 年前

    您可以参考现有的解决方案: https://stackoverflow.com/a/16839559/371531

    此工具使用比较器<t>。在.NET Framework 4.5中引入了Create。

        3
  •  2
  •   devoured elysium    15 年前

    IComparer是一个接口,而不是委托。

    您需要在它的.compareTo()上使用lambda表达式,而不是在接口本身上。

        4
  •  1
  •   ezolotko    11 年前

    使用以下简单类:

    public static class ComparerUtilities
    {
        class _Comparer<T> : Comparer<T>
        {
            Comparison<T> _comparison;
    
            public _Comparer(Comparison<T> comparison)
            {
                _comparison = comparison;
            }
    
            public override int Compare(T x, T y)
            {
                return _comparison(x, y);
            }
        }
    
        public static IComparer<T> FromComparison<T>(Comparison<T> comparison)
        {
            return new _Comparer<T>(comparison);
        }
    }