c# - 修改属性后列出顺序更改

标签 c# linq list lambda

我有以下代码:

                // Order a list
                var orderedList = myList.OrderBy(x => x.name);

                // Take few elements to another list (copies as reference)
                List<GameObject> myList2 = orderedList.Where(x => x.z == y).ToList();

                // Rename the objects in myList2
                foreach(stuff in myList2)
                {
                    stuff.name = "Renamed";
                }

问题是为什么修改myList2中对象的一个​​属性后会改变orderedList的顺序?

例如,如果有序列表是 "a,b,c,d" 而我取了 "b"和 "c "到 myList2。那么 orderedList 将是“a,d,Renamed,Renamed” 而不是“a,Renamed, Renamed, d”。

最佳答案

因为 orderedList不是列表,而是查询

每次迭代 orderedList , OrderBy 再次被调用。这叫做 deferred execution .


您可以通过具体化查询来停止该行为,例如

var orderedList = myList.OrderBy(x => x.name).ToList();

这样,改变orderedList中的元素实际上不会更改 orderedList 中项目的顺序.

如果myList已经是 List<> ,您当然可以就地对列表进行排序,而不是创建另一个列表,例如

// Order a list; don't create a new one
myList.Sort((a, b) => a.name.CompareTo(b.name));

关于c# - 修改属性后列出顺序更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19448114/

相关文章:

c# - 我能以某种方式使用动态对象模拟多重继承吗?

c# - LINQ 查询按某些条件将有序列表拆分为连续点的子列表

c# - 此 Moq 测试主要针对 linq 语法如何工作?

list - pytorch中有类似 'TensorList’的东西吗?

html - 列表样式 - 使用计数器时的第二行缩进

c# - 根据条件更改 GridView 行颜色

c# - 寻找类似 HashSet 的东西,但具有一系列键值?

c# - 使用 Network Solutions 托管电子邮件的 System.Net 邮件设置

c# - 使用两列的 Linq 查询分组数据表

c# - 如何将外部参数包含到列表中