为什么Linq order扩展不影响调用它的列表?
本文关键字:列表 调用 影响 Linq order 扩展 为什么 | 更新日期: 2023-09-27 18:01:39
我正在尝试编写一个基于字符串列名和linq的通用排序扩展方法。
我这里有大部分,但它还不能工作。逻辑取自本网站。
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;
}
通过这段代码,我看到列表被正确排序,但是当返回时,它对我传入的列表没有影响。我猜AsQueryable或OrderBy正在内存中创建一个新对象,我不再指向相同的引用。有没有人有一些建议,如何使这个工作适当,或禁止,另一个解决方案?谢谢!
这是一个不同的列表。ToList()
调用创建一个新的List<T>
实例,与传递到方法中的List<T>
完全分离。它将包含相同的项,可能以不同的顺序,但列表本身是一个不同的对象。
有没有人有一些技巧,如何使这个工作适当,或禁止,另一个解决方案?
如果要修改原始列表,请使用List<T>.Sort
LINQ背后的一个基本思想是它不会修改它所调用的对象。
OrderBy()
可以在任何IEnumerable<T>
上调用,即使那些没有任何类似列表的支持(例如,它是在飞行中生成的)。如果它做了这样的事情,那将是非常不一致的:"如果源是IList<T>
,对其进行排序并返回原始引用。