2013-05-16 105 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