为何用OrderByDescending排序ICollection后原集合最终为空?
问题原因及解决方案
核心问题:LINQ的延迟执行特性
OrderByDescending返回的IOrderedEnumerable<Plante>是一个延迟执行的查询对象——它并没有立即把排序结果存入内存,而是要等到你第一次遍历它时,才会去访问原数据源(也就是Jardin)执行排序逻辑。
你在获取Temp后立刻调用Jardin.Clear()清空了原数据源,这时候再遍历Temp时,LINQ去原集合取数据时已经没有元素了,自然遍历不到任何内容,最终Jardin还是空的。
解决办法
方法1:先将查询结果立即物化到内存
调用ToList()或ToArray()方法,把排序后的元素提前存入独立的内存集合,这样后续操作原集合不会影响这个已固化的结果:
public void TriDesc() { Console.WriteLine("Tri par taille décroissante"); // 用ToList()立即执行查询,将结果存入内存集合 List<Plante> Temp = Jardin.OrderByDescending(a => a.Taille).ToList(); Jardin.Clear(); foreach (Plante p in Temp) { Console.WriteLine(p.Taille); Jardin.Add(p); } }
方法2:调整操作顺序(针对List等具体实现)
如果Jardin的实际类型是List<Plante>,可以用AddRange简化操作,避免先清空再逐个添加的繁琐:
// 确保Jardin的实际类型是List<Plante> private readonly List<Plante> Jardin; public void TriDesc() { Console.WriteLine("Tri par taille décroissante"); var sortedPlantes = Jardin.OrderByDescending(a => a.Taille).ToList(); Jardin.Clear(); Jardin.AddRange(sortedPlantes); // 打印验证 foreach (var p in Jardin) { Console.WriteLine(p.Taille); } }
补充说明
LINQ的延迟执行是为了优化性能,避免不必要的内存开销,但在操作原数据源时必须注意这个特性:要么确保执行查询前原数据源可用,要么提前将查询结果物化。
内容的提问来源于stack exchange,提问作者Gui Gui
相关产品推荐
相关产品推荐

