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 ".
因为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)