tom*_*ing 2 c# linq-to-objects c#-3.0
我有一些LINQ到对象代码如下,它以特定的"复杂"顺序获取集合中的项:
var items = this.Items.OrderBy(a => a.DisplayType == DisplayType.Integer ? 0 : 1)
.ThenBy(a => a.DisplayType == isplayType.String ? 0 : 1)
.ThenBy(a => a.Name);
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是,我希望能够重用这个"链"而不重复代码.
我可以做得很好,而我们正在排序的所有类型的属性都是相同的:
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());
Run Code Online (Sandbox Code Playgroud)
但后来我没有看到如何包含a.Name - 因为返回类型是Func,而Column.Name是一个字符串.
任何帮助赞赏.
汤姆
如果你想重用那个顺序,我会写一个应用顺序的扩展方法,而不是调用OrderBy:
internal static IOrderedEnumerable<Column> OrderByDefaults
(this IEnumerable<Column> source)
{
return source.OrderBy(a => a.DisplayType != FieldDisplayType.Integer)
.ThenBy(a => a.DisplayType != FieldDisplayType.String);
}
Run Code Online (Sandbox Code Playgroud)
然后用:
var items = this.Items.OrderByDefaults()
.ThenBy(a => a.Name);
Run Code Online (Sandbox Code Playgroud)
两点:
我肯定会坚持使用OrderBy/ThenBy/ThenBy,而不是使用条件子句构建自己的大型比较器 - 只是因为它更容易阅读,IMO.
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |