为何LINQ的OrderBy查询结果必须赋值给变量才能得到排序后的列表?
为何LINQ的OrderBy查询结果必须赋值给变量才能得到排序后的列表?
哈哈,这个问题我刚学LINQ的时候也踩过一模一样的坑!容我给你掰扯明白~
首先得搞清楚一个核心点:LINQ的OrderBy方法根本不会修改你原来的list集合!它的作用是生成并返回一个全新的、经过排序的序列,而不是在原列表上“原地排序”。
你看你写的这段代码:
// 这行代码其实白写了... list.OrderBy(p => p.CustomerName);
这行代码确实在内存里生成了排序后的序列,但你没把这个序列存到任何变量里,它生成后就直接被丢弃了,原列表list自然还是保持原来的顺序,完全没变化。
而当你写var sorted = list.OrderBy(p => p.CustomerName);的时候,其实是把这个新生成的排序序列“接住”并存到了sorted变量里,所以你后续用sorted的时候,才能看到排序后的结果。
说到这儿,顺便给你补两个实用小技巧:
- 如果你就是想让原来的
list本身变成排序后的状态,别用LINQ的OrderBy,直接用List自带的Sort方法就行,它是原地修改原列表的,不用赋值:list.Sort((a, b) => string.Compare(a.CustomerName, b.CustomerName)); - 如果你想把
OrderBy返回的序列转成实实在在的List对象(而不是延迟执行的序列),可以在后面加个ToList():var sortedList = list.OrderBy(p => p.CustomerName).ToList();
为啥LINQ要这么设计?其实是为了代码安全——LINQ的大部分方法(比如Where、Select)都遵循“不修改原始数据源”的原则,这样能避免你不小心改了原数据导致的bug,让代码逻辑更清晰、更可预测。
内容来源于stack exchange
相关产品推荐
相关产品推荐

