C#linq sort – 实例化IComparer的快捷方式

使用linq时,你有

c.Sort() 

是否有任何良好的内联方式来定义Comparison和/或IComparer类而无需实际创建单独的类?

这是lambda表达式的一个用法:

c.Sort( (x,y) => xACompareTo(yA))

编辑 :修复了返回int(使用CompareTo)而不是bool的示例

我在MiscUtil中有一个ProjectionComparer类,所以你可以这样做:

 IComparer comparer = ProjectionComparer.Create(x => x.Name); c.Sort(comparer); 

代码也在这个答案中 。

您也可以直接使用lambda表达式创建Comparison实例,但我通常不喜欢涉及的重复。 说到哪,它往往会有点短……

编辑:如上所述,从.NET 4.5开始,使用Comparer.Create做同样的事情。

Jon的答案很棒,但可能有点过时了,随着.NET 4.5的发布我们现在( 终于! )拥有这个很棒的方法Comparer.Create

 items.Sort((x, y) => x.Value.CompareTo(y.Value)); //sorting List items.OrderBy(x => x, Comparer.Create((x, y) => x.Value.CompareTo(y.Value))); //sorting IEnumerable 

假设Item定义如下:

 class Item { public readonly int Key; public readonly string Value; public Item(int key, string value) { Key = key; Value = value; } } 

我不知道你的例子中有什么c.Sort() ,因为它可以是很多东西(你的意思是List.Sort() ?),但有一点肯定不是LINQ。 LINQ没有Sort() – 它有OrderBy()

也就是说,后者也适用于IComparer ,并且无法创建实现“内联”接口的匿名类实例,因此您必须定义一个类。

对于List.Sort() ,有一个重载需要Comparison 。 由于它是委托类型,您可以使用lambda来提供内联函数:

 List xs = ...; xs.Sort((x, y) => y - x); // reverse sort 

如果List c中的对象已经实现了IComparable,那么您将不需要另一个。 但是,如果需要自定义比较,则可以在嵌套类中实现IComparer。 您还可以使用lambda表达式动态创建Comparison方法:

persons.Sort( (person1, person2) => person1.Age.CompareTo( person2.Age ) );