a.DisplayType == -6ren">
gpt4 book ai didi

c# - 如何返回 "chain"的 OrderBy() 调用以实现可重用性

转载 作者:行者123 更新时间:2023-11-30 20:10:40 24 4
gpt4 key购买 nike

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

var items = this.Items.OrderBy(a => a.DisplayType == DisplayType.Integer ? 0 : 1)
.ThenBy(a => a.DisplayType == isplayType.String ? 0 : 1)
.ThenBy(a => a.Name);

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

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

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

但后来我不知道如何包含 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);
}

然后调用它:

var items = this.Items.OrderByDefaults()
.ThenBy(a => a.Name);

两点:

  • 我不关心整数:“false”的排序不如“true”,所以我相信这可以满足您的需求。不过,您可以恢复为每个属性使用整数
  • 这种方法的缺点是您需要为扩展方法使用静态非泛型顶级类型。

我肯定会坚持使用 OrderBy/ThenBy/ThenBy 而不是使用条件子句构建您自己的大型比较器 - 只是因为它更容易阅读,IMO。

关于c# - 如何返回 "chain"的 OrderBy() 调用以实现可重用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4761749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com