C# 匿名IComparer实现
是否可以定义IComparer的匿名实现 我相信Java允许以内联方式定义匿名类——C# 看看这段代码,我想定义一个自定义的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
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));