2013-05-16 164 views
0

我想做的事情一樣解釋在這裏: Sorting a list using Lambda/Linq to objectsLINQ - 排序的自定義列表

那就是:

public enum SortDirection { Ascending, Descending } 
public void Sort<TKey>(ref List<Employee> list, 
        Func<Employee, TKey> sorter, SortDirection direction) 
{ 
    if (direction == SortDirection.Ascending) 
     list = list.OrderBy(sorter); 
    else 
     list = list.OrderByDescending(sorter); 
} 

調用它,他說做:

排序(REF員工,e => e.DOB,SortDirection.Descending);

但我不明白TKey指的是什麼,正如我在調用中看到的,它錯過了通用TKey。

你能解釋一下TKey是什麼以及如何使用它?

我想我可以使用另一個名稱的方法,沒有必要進行排序,對不對?

謝謝!

+1

您的代碼將無法使用。你將不得不改變它:'list = list.OrderBy(sorter).ToList();'。 ' – Steven

回答

3

按鍵排序,其類型爲TKey,必須執行IComparable<TKey>。例如:

// key: Firstname 
// TKey: string (which is IComparable<String> 
list.OrderBy(person => person.Firstname); 

上面的代碼排序通過姓名,這是你定義使用sorter什麼。是的,你可以給你的方法任何你喜歡的名字。它不必被命名爲Sort

改進建議(間接相關的問題)

,而不是改變list,並把它當作一個參考,我建議你考慮以下實現:

public IOrderedEnumerable<Employee> Sort<TKey>(IEnumerable<Employee> list, Func<Employee, TKey> sorter, SortDirection direction); 
{ 
    IOrderedEnumerable<Employee> result; 
    if (direction == SortDirection.Ascending) 
     result = list.OrderBy(sorter); 
    else 
     result = list.OrderByDescending(sorter); 
    return result; 
} 

,那麼你可以返回一個新訂購的枚舉Employee對象而不是更改舊的,並使用任何枚舉而不是List僅限物件。這給你更多的靈活性,更接近人們傾向於習慣的LINQ實現。

+0

太棒了!我做了你所說的,它就像一個魅力!非常感謝! – user1624552