C# 匿名IComparer实现

C# 匿名IComparer实现,c#,C#,是否可以定义IComparer的匿名实现 我相信Java允许以内联方式定义匿名类——C# 看看这段代码,我想定义一个自定义的IComparerinline public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, ICo

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

我相信Java允许以内联方式定义匿名类——C#

看看这段代码,我想定义一个自定义的
IComparer
inline

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)
公共静态IORDerenumerable OrderBy(
这是一个数不清的来源,
Func键选择器,
IComparer比较器
)

不,这是不可能的。但是,您可以通过
Comparer.default
获得
IComparer
的默认实现。否则,您需要创建一个参数化实现并使用该实现的实例。

否,C#当前不允许内联接口实现;尽管它允许您通过lambda表达式和匿名方法内联创建委托

在您的情况下,我建议使用一个
projectoncomparer
,它可以方便地使用此功能,如所列功能。

C#不允许使用匿名内联类实现接口,这与Java不同。对于简单的比较(即在单个键上进行比较),在C#中有更好的方法。您只需使用
.OrderBy()
方法并传入指定键的lambda表达式

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;


namespace Test{
    public class Test{
        public static void Main(){
            IList<int> mylist = new List<int>();
            for(int i=0; i<10; i++) mylist.Add(i);
            var sorted = mylist.OrderBy( x => -x );
            foreach(int x in sorted)
                Console.WriteLine(x);
        }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
名称空间测试{
公开课考试{
公共静态void Main(){
IList mylist=新列表();
对于(int i=0;i-x);
foreach(已排序的整数x)
控制台写入线(x);
}
}
}

即使您不能创建实现接口的匿名类,但在大多数情况下(如排序等),您通常可以使用而不是:


另外还有一些内置的
IComparer
实现,如或…

看看这两个问题,它们基本上解决了相同的问题


如果您这样做,您应该特别注意Slaks的评论和hashcode实现

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

如以下注释之一所示,.Net 4.5允许通过比较器类上的静态方法进行此操作,例如,根据类中属性的值比较两个对象:

var comparer = Comparer<KilowattSnapshot>.Create( 
        (k1, k2) => k1.Kilowatt.CompareTo(k2.Kilowatt) );
var comparer=comparer.Create(
(k1,k2)=>k1.千瓦,与(k2.千瓦)相比;

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

@ChloeRadshaw:Java确实允许实现接口的匿名内部类,但它目前没有一流的函数概念(如委托)。随着即将推出的.NET4.5(Visual Studio 2012)通过使用新的工厂方法
Comparer.Create
,可以从
comparator
lambda箭头创建
IComparer
。唯一的事情是
Comparer.Create
非常难看,因为它无法推断参数(与
Tuple.Create
Tuple
交互方式相比)。这是我的解决方法:您可以在相关问题中找到答案:
Array.Sort(arrayName, (x,y) => string.Compare(x.Name,y.Name,StringComparison.CurrentCulture));
Array.Sort(arrayName, (x,y) => string.Compare(x.Name,y.Name,StringComparison.CurrentCulture));