匿名IComparer实现

Jac*_*ada 43 c#

是否可以定义IComparer的匿名实现?

我相信Java允许内联定义匿名类 - C#?

看看这段代码我想定义一个自定义IComparer内联

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)
Run Code Online (Sandbox Code Playgroud)

Dav*_*rke 37

如下面的评论之一所示,.Net 4.5通过Comparer <>类上的静态方法允许此操作,例如,根据类中属性的值比较两个对象:

var comparer = Comparer<KilowattSnapshot>.Create( 
        (k1, k2) => k1.Kilowatt.CompareTo(k2.Kilowatt) );
Run Code Online (Sandbox Code Playgroud)

显然,这可以用于内联而不是分配给变量.


apo*_*fos 13

.NET framework 4.5版提供了Comparer.Create(Comparison)方法,用于根据指定的比较委托(可以是lambda函数)创建比较器.然而,使用早期版本的.NET的人可能需要自己实现类似的东西.


Jar*_*dek 12

即使您无法创建实现接口的匿名类,在大多数情况下(例如排序等),通常可以使用比较代理而不是IComparer接口:

Array.Sort(arr, (x, y) => 1);
Run Code Online (Sandbox Code Playgroud)

还有一些内置的实现,IComparer比如Comparer ClassStringComparer Class ......

  • 使用即将推出的.NET4.5(Visual Studio 2012),可以使用新的工厂方法`Comparer <>.Create`从`Comparison <>`lambda箭头创建`IComparer <>`. (10认同)

Ani*_*Ani 10

不,C#目前不允许内联接口实现; 虽然它确实允许您创建代表通过lambda表达式和匿名方法的内联.

在您的情况下,我建议使用一个ProjectionComparer可以轻松使用此功能的功能,例如此处列出的功能 .

  • @ChloeRadshaw:Java确实允许实现接口的匿名内部类,但它目前没有一流的功能概念(例如委托). (3认同)