为什么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正在内存中创建一个新对象,我不再指向相同的引用。有没有人有一些建议,如何使这个工作适当,或禁止,另一个解决方案?谢谢!

为什么Linq order扩展不影响调用它的列表?

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

顺便说一下,动态linq已经做到了这一点,所以你可能想看看它。你可以从这里开始阅读

有没有人有一些技巧,如何使这个工作适当,或禁止,另一个解决方案?

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

LINQ背后的一个基本思想是它不会修改它所调用的对象。

OrderBy()可以在任何IEnumerable<T>上调用,即使那些没有任何类似列表的支持(例如,它是在飞行中生成的)。如果它做了这样的事情,那将是非常不一致的:"如果源是IList<T>,对其进行排序并返回原始引用。