0

我想做与此处解释的相同的操作: 使用 Lambda/Linq 对列表进行排序到对象

那是:

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 => e.DOB,SortDirection.Descending);

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

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

我想我可以为方法使用另一个名称,不一定是排序,对吧?

谢谢!

4

1 回答 1

3

您按类型且必须实现的键进行排序。例如:TKeyIComparable<TKey>

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

上面的代码按 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 实现。

于 2013-05-16T10:05:52.313 回答