c# - Linq 和排序依据

标签 c# .net linq lambda

我有一个可以使用通用 OrderBy 参数的通用类

类如下

 class abc<T> where T : myType
 {
   public abc(....., orderBy_Argument ){ ... }
   void someMethod(arg1, arg2, bool afterSort = false)
   {
       IEnumerable<myType> res ;
       if ( afterSort && orderBy_Argument != null )
          res = src.Except(tgt).OrderBy( .... );
       else
          res = src.Except(tgt);
   }
}

orderBy 可以有多种类型

例如

.OrderBy( person => person.FirstName )
.OrderBy( person => person.LastName )
.OrderBy( person => person.LastName, caseInsensitive etc )

我们的目标是使 orderBy 成为一个参数而不是将其烘焙

有什么想法吗?

最佳答案

不要将参数传递给OrderBy传递一个转换IEnumerable(或IQueryable,可能是这样)。

修改您的示例以执行此操作会产生以下程序:

using System;
using System.Collections.Generic;
using System.Linq;

class abc<T>  {
    Func<IEnumerable<T>,IEnumerable<T>> sorter;
    public abc(Func<IEnumerable<T>,IEnumerable<T>> sorter) {
        this.sorter=sorter ?? (x=>x);
    }
    public void someMethod(IEnumerable<T> src, bool afterSort = false) {
        var res= (afterSort?sorter:x=>x) (src.Skip(5).Take(10));

        Console.WriteLine(string.Join(", ",res.Select(el=>el.ToString()).ToArray()));
    }
}

public class Program {
    static void Main()    {
        var strs = Enumerable.Range(0,1000).Select(i=>i.ToString());

        var myAbc = new abc<string>(
            xs=>xs.OrderByDescending(x=>x.Length).ThenByDescending(x=>x.Substring(1))
        );

        myAbc.someMethod(strs);      //5, 6, 7, 8, 9, 10, 11, 12, 13, 14
        myAbc.someMethod(strs,true); //14, 13, 12, 11, 10, 5, 6, 7, 8, 9
    }
}

当然,这是一个非常奇怪的排序和荒谬的 someMethod - 但它表明您可以传入一个非常灵活的排序委托(delegate)(实际上,委托(delegate)可以做的不仅仅是排序)只有很短的实现时间。

关于c# - Linq 和排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938046/

相关文章:

c# - C# 中的简单 LINQ 问题

c# - 检查字典键包含

c# - 如何通过 lambda/方法表达式使用 linq 创建嵌套组

c# - 无法从票证集合中选择最新的票证

c# - Linq 按 Null 数量排序结果

c# - 为什么 Struct 中属性的顺序会改变实例的大小?

c# - 有没有一种简单的方法可以让dynamic/ExpandoObject返回字符串而不是对象?

.net - Parallel.ForEach - 优雅的取消

c# - 如何水平打印数组的内容?

.net - 表单识别器 API |自 2020 年 5 月 11 日起修复 |客户端使用空字段替换结果