3

コレクション内のアイテムのシーケンスを並べ替えられるように、コレクションを変更する必要があります。

だから私は次のようなことをしています:

IEnumerable<ItemType> ordered = myItems.OrderBy( (item) => item.Age);

しかし、myItemsコレクション自体を変更して順序付けられたシーケンスを作成したいのですが...可能ですか?

私は次のようなものが欲しいです:

myItems.SomeActionHere // This should modify myItems in place.

これは初心者または初心者の質問かもしれません。申し訳ありません。

4

4 に答える 4

11

配列の場合は、Array.Sortを使用できます。これにより、参照/値を複製せずにインプレースソートが実行されます。

ただし、同様に、参照の複製が問題にならない場合は、linqステートメントにタグを付ける.ToArray().ToList()、linqステートメントの最後にタグを付けて、順序付けられた列挙可能オブジェクトを「実現」することができます(通常はそうではありません)。

例えば:

myItems = myItems.OrderBy(i => i.Age).ToArray();

どうしても別のReadOnlyCollectionインスタンスとして戻す必要がある場合は、次のようにすることができます。

myItems = new ReadOnlyCollection<ItemType>(myItems.OrderBy(i => i.Age).ToArray());

.ToArray()配列IList<T>は変更できない場合でも実装されるため、機能することに注意してください。

または、 Array.AsReadOnlyもあり、ヘッドをオンにします。

myItems = Array.AsReadOnly(myItems.OrderBy(i => i.Age).ToArray());

コードの行が短いことを除けば、山かっこを減らすことが重要でない限り、あまりメリットはありません:)

于 2012-06-13T13:25:24.493 に答える
2

Linqを使用してコレクションを注文することはできません。特に行っOrderByてシーケンスタイプを実装しない限り。

于 2012-06-13T13:25:15.647 に答える
0

OrderBy(他のほとんどのLinq演算子と同様に)怠惰です; 結果を具体化するのではなく、毎回ソースコレクションを再読み込みするだけです。したがって、の内容を変更するとmyItems、列挙するたびにordered、の最新の変更が表示されmyItemsます。

于 2012-06-13T13:26:27.273 に答える
0

SortedListを使用するか、 SortedListに変換します。

于 2012-06-13T13:31:27.463 に答える