LINQ - 对自定义列表进行排序

时间:2013-05-16 10:03:25

标签: linq sorting

我想按照此处的说明进行操作: Sorting a list using Lambda/Linq to objects

即:

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

打电话给他,他说:

排序(参考员工,e =&gt; e.DOB,SortDirection.Descending);

但是我不明白TKey所指的是什么,正如我在电话中看到的那样,它错过了通用的TKey。

你能解释一下TKey是什么以及如何使用它吗?

我想我可以为方法使用另一个名称,没有必要排序,对吗?

谢谢!

1 个答案:

答案 0 :(得分: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;
}

然后,您可以返回{em>新的有序可枚举Employee个对象,而不是更改旧的对象并使用任何可枚举的而不是List个对象只要。这为您提供了更大的灵活性,并且更接近人们习惯习惯的LINQ实现。