【问题标题】:Linq and order byLinq 和 order by
【发布时间】:2010-10-14 22:18:49
【问题描述】:

我有一个可以使用通用 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 成为一个参数,而不是把它放进去

有什么想法吗?

【问题讨论】:

  • 您可能可以使用这个著名问题中的一些内容:Dynamic LINQ OrderBy。 Marc Gravell 给出了一个很好的答案,得到了很多人的支持。

标签: c# .net linq lambda


【解决方案1】:

不要将 参数 传递给 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 - 但它表明您可以传递一个非常灵活的排序委托(实际上,委托可以做的不仅仅是排序)只需要很短的实现.

【讨论】:

    【解决方案2】:

    只需将排序键作为委托传递:

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

    缺点是需要额外的类型参数...

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多