Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回一个";连锁店;OrderBy()调用的可重用性_C#_C# 3.0_Linq To Objects - Fatal编程技术网

C# 如何返回一个";连锁店;OrderBy()调用的可重用性

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

我有一些LINQ to objects代码,如下所示,它以特定的“复杂”顺序获取集合中的项:

这真的很有效。但是,我希望能够在不复制代码的情况下重用此“链”

我可以很好地做到这一点,而我们正在排序的所有属性类型都是相同的:

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);