为什么Linq OrderBy扩展名不会影响它被调用的列表?

Iro*_*fin 8 c# linq sorting generics .net-4.0

我试图基于字符串列名和linq编写一个通用的排序扩展方法到List.

我在这里有大部分内容,但它还没有奏效.逻辑取自本网站.

public static List<T> Sort<T>(this List<T> list, string sortColumn, string sortOrder) 
{
    if (string.IsNullOrWhiteSpace(sortColumn))
        return list;

    int order = sortOrder == "desc" ? -1 : 1;

    var param = Expression.Parameter(typeof(T), "x");
    var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
    list = list.AsQueryable().OrderBy(sortExpression).ToList();

    return list;
}
Run Code Online (Sandbox Code Playgroud)

单步执行此代码,我看到列表已正确排序,但返回时,它对我传入的列表没有影响.我猜测AsQueryable或OrderBy正在内存中创建一个新对象,我不再指向相同的参考.有没有人有一些关于如何使这项工作适当的提示,或者除此之外,另一种解决方案?谢谢!

Ken*_*art 11

这是一个不同的列表.该ToList()调用创建一个新List<T>实例,与List<T>传递给该方法的实例完全分开.它将包含相同的项目,可能是以不同的顺序,但列表本身是一个不同的对象.

顺便说一句,动态linq已经这样做了,所以你可能想要检查出来.你可以在这里开始阅读它.


jas*_*son 6

有没有人有一些关于如何使这项工作适当的提示,或者除此之外,另一种解决方案?

如果要修改原始列表,请使用List<T>.Sort.