2010-10-14 51 views
5

我有可能使用一個通用的OrderBy參數的通用類LINQ和爲了通過

類是如下

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) 

我們的目標是使排序依據的論據,而不是

任何想法做麪包呢?

+0

可能你可以使用這個着名的問題:[動態LINQ OrderBy](http://stackoverflow.com/questions/41244/dynamic-linq-orderby)。馬克·格雷韋爾用一堆讚揚來回答很好的問題。 – 2010-10-14 22:24:01

回答

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 - 但它表明,你可以在一個非常靈活的排序委託傳遞(事實上​​,代表可以做的不僅僅是排序),而只是一個很短的實​​現。

+0

我可以給一個實際編譯的例子,如果這更清晰... – 2010-10-14 23:08:21

+0

謝謝,這真的會有所幫助! – Kumar 2010-10-15 16:23:29

1

只是傳遞排序關鍵字作爲代表:

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

的缺點是,它需要一個額外的類型參數...