2

次のコードがあります。

                // 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,Renamed, Renamed, d "ではなく" a,d,Renamed,Renamed"になります。

4

1 に答える 1

6

orderedListリストではなくクエリだからです。

を繰り返し処理するたびにorderedList、が再度OrderBy呼び出されます。これは遅延実行と呼ばれます。


次のようにクエリを具体化することで、その動作を停止できます

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));
于 2013-10-18T11:08:59.653 に答える