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
做同样的事情。
Jon的答案很棒,但可能有点过时了,随着.NET 4.5的发布我们现在( 终于! )拥有这个很棒的方法Comparer
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
?),但有一点肯定不是LINQ。 LINQ没有Sort()
– 它有OrderBy()
。
也就是说,后者也适用于IComparer
,并且无法创建实现“内联”接口的匿名类实例,因此您必须定义一个类。
对于List
,有一个重载需要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 ) );