我有以下代码:

                // 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));

09-25 20:34