我有以下代码:
// 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/