如何返回OrderBy()的"链"调用可重用性

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是一个字符串.

任何帮助赞赏.

汤姆

Jon*_*eet 7

如果你想重用那个顺序,我会写一个应用顺序的扩展方法,而不是调用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.