C# 如何返回一个";连锁店;OrderBy()调用的可重用性
我有一些LINQ to objects代码,如下所示,它以特定的“复杂”顺序获取集合中的项: 这真的很有效。但是,我希望能够在不复制代码的情况下重用此“链” 我可以很好地做到这一点,而我们正在排序的所有属性类型都是相同的:C# 如何返回一个";连锁店;OrderBy()调用的可重用性,c#,c#-3.0,linq-to-objects,C#,C# 3.0,Linq To Objects,我有一些LINQ to objects代码,如下所示,它以特定的“复杂”顺序获取集合中的项: 这真的很有效。但是,我希望能够在不复制代码的情况下重用此“链” 我可以很好地做到这一点,而我们正在排序的所有属性类型都是相同的: private static Func<Column, int> GetOrderBy() { return a => a.DisplayType == FieldDisplayType.Integer ? 0 : a.Display
private static Func<Column, int> GetOrderBy()
{
return a => a.DisplayType == FieldDisplayType.Integer ? 0 :
a.DisplayType == FieldDisplayType.String ? 1 : 2;
}
var items = this.Items.OrderBy(GetOrderBy());
private static Func GetOrderBy()
{
返回a=>a.DisplayType==FieldDisplayType.Integer?0:
a、 DisplayType==FieldDisplayType.String?1:2;
}
var items=this.items.OrderBy(GetOrderBy());
但是我不知道如何包含.Name,因为返回类型是Func,而Column.Name是字符串
谢谢你的帮助
Tom如果您想重用该排序,我将编写一个应用排序的扩展方法,而不是调用OrderBy:
internal static IOrderedEnumerable<Column> OrderByDefaults
(this IEnumerable<Column> source)
{
return source.OrderBy(a => a.DisplayType != FieldDisplayType.Integer)
.ThenBy(a => a.DisplayType != FieldDisplayType.String);
}
两点:
- 我不在乎整数:“false”排序比“true”排序少,所以我相信这就是你想要的。不过,您可以将其恢复为对每个属性使用整数
- 这种方法的缺点是需要为扩展方法创建一个静态的非通用顶级类型
我肯定会坚持使用OrderBy/ThenBy/ThenBy,而不是用条件从句构建自己的大比较器,因为它更容易阅读,我想。欣赏Jon横向思维的输入。很好用,非常感谢。
internal static IOrderedEnumerable<Column> OrderByDefaults
(this IEnumerable<Column> source)
{
return source.OrderBy(a => a.DisplayType != FieldDisplayType.Integer)
.ThenBy(a => a.DisplayType != FieldDisplayType.String);
}
var items = this.Items.OrderByDefaults()
.ThenBy(a => a.Name);