2010-10-14 35 views
5

Tôi có một lớp học chung chung mà có thể sử dụng một đối số OrderBy genericLINQ và trật tự bởi

lớp như sau

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

Các orderBy có thể là các loại

ví dụ

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

Mục đích là để làm cho orderBy một cuộc tranh cãi chứ không phải nướng nó trong

bất kỳ ý tưởng?

+0

Có khả năng bạn có thể sử dụng điều gì đó từ câu hỏi nổi tiếng này: [Dynamic LINQ OrderBy] (http://stackoverflow.com/questions/41244/dynamic-linq-orderby). Marc Gravell có một câu trả lời tuyệt vời với một loạt các upvotes. –

Trả lời

1

Đừng vượt qua trong các luận-OrderBy vượt qua trong một hàm biến đổi IEnumerable (hoặc IQueryable, vì có thể).

Sửa đổi ví dụ của bạn để làm như vậy kết quả trong chương trình sau:

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

Tất nhiên, đây là một trật tự khá kỳ lạ và một vô nghĩa someMethod - nhưng nó chứng tỏ rằng bạn có thể vượt qua trong một phân loại đại biểu rất linh hoạt (thực sự, các đại biểu có thể làm nhiều hơn là chỉ sắp xếp) chỉ với một thực hiện rất ngắn.

+0

Tôi có thể đưa ra một ví dụ biên dịch thực sự nếu nó rõ ràng hơn ... –

+0

cảm ơn, điều đó thực sự sẽ hữu ích! – Kumar

1

Chỉ cần vượt qua phím loại như một đại biểu:

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

Nhược điểm là nó đòi hỏi một tham số kiểu thêm ...