修改属性后列出订单更改

Esa*_*Esa 2 c# linq lambda list

我有以下代码:

                // 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";
                }
Run Code Online (Sandbox Code Playgroud)

问题是为什么修改myList2中对象的属性后更改orderedList的顺序?

例如,如果有序列表是"a,b,c,d",我将" b "和" c "带到myList2.那么orderedList将是" a,d,Renamed,Renamed"而不是" a,renamed,Renamed,d ".

slo*_*oth 6

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

每次迭代时orderedList,OrderBy都会再次调用.这称为延迟执行.


您可以通过实现查询来停止该行为,例如

var orderedList = myList.OrderBy(x => x.name).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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

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