使用linq时你有
c.Sort()
是否有任何良好的内联方式来定义Comparison
和/或IComparer
类而无需实际创建单独的类?
答案 0 :(得分:55)
这是lambda表达式的一个用法:
c.Sort( (x,y) => x.A.CompareTo(y.A))
编辑:修复示例返回int(使用CompareTo)而不是bool
答案 1 :(得分:16)
我在MiscUtil中有一个ProjectionComparer
课程,您可以这样做:
IComparer<Foo> comparer = ProjectionComparer<Foo>.Create(x => x.Name);
c.Sort(comparer);
代码也在this answer。
您也可以直接使用lambda表达式创建Comparison<T>
实例,但我通常不喜欢涉及的重复。说了这些,它往往会变得更短......
编辑:如上所述,从.NET 4.5开始,使用Comparer<T>.Create
做同样的事情。
答案 2 :(得分:10)
Jon的回答很棒,但可能有点过时,
随着.NET 4.5的发布,我们现在(终于!)拥有这个非常棒的方法Comparer<T>.Create
items.Sort((x, y) => x.Value.CompareTo(y.Value)); //sorting List<T>
items.OrderBy(x => x, Comparer<Item>.Create((x, y) => x.Value.CompareTo(y.Value))); //sorting IEnumerable<T>
假设Item
定义如下:
class Item
{
public readonly int Key;
public readonly string Value;
public Item(int key, string value)
{
Key = key;
Value = value;
}
}
答案 3 :(得分:7)
我不知道你的例子中有c.Sort()
是什么,因为它可以是很多东西(你的意思是List<T>.Sort()
吗?),但有一件事肯定不是LINQ。 LINQ没有Sort()
- 它有OrderBy()
。
也就是说,后者也适用于IComparer
,并且无法创建实现“内联”接口的匿名类实例,因此您必须定义一个类。
对于List<T>.Sort()
,有一个重载需要Comparison<T>
。由于它是委托类型,因此您可以使用lambda来提供内联函数:
List<int> xs = ...;
xs.Sort((x, y) => y - x); // reverse sort
答案 4 :(得分:3)
如果List c中的对象已经实现了IComparable,那么您将不需要另一个。 但是,如果需要自定义比较,则可以在嵌套类中实现IComparer。 您还可以使用lambda表达式动态创建比较方法:
persons.Sort( (person1, person2) => person1.Age.CompareTo( person2.Age ) );