0

リバース拡張メソッドを使用するコードがいくつかあります。

元のリストが逆にならないようにするために、元のプログラマーは GetRange を使用して新しいリストを作成しました。

dim a = New List(of Thing)
... fill in a
dim b = a.GetRange(0, a.count)
b.reverse()

おそらく、GetRange は常に新しいオブジェクトを作成することを保証します。これはToListにも当てはまりますか?

次に、次のように書くことができます。

dim a = New List(of Thing)
... fill in a
dim b = a.ToList()
b.reverse()

その利点は、 a の型が IEnumerable(of T) であり、それでも機能することです。

私はこれを自分でテストしましたが、b が新しいオブジェクトであることは常に真実でした。質問はこれです:

将来の実装が同じように動作することが保証されていますか、それともこの動作は実装の偶然ですか?

明らかな「最適化」は、元のオブジェクトがすでにリストである場合、元のオブジェクトへの参照を返すことです。これはもちろん、2 番目のバージョンが元のリストを逆にすることを意味します。

4

3 に答える 3

1

これが実装の詳細にすぎない理由がわかりません。

IEnumerable<T>リストである必要はまったくありません。列挙できるものだけです。したがってToList()、列挙可能な全体をトラバースし、すべての結果を含む新しいリストを作成する以外に選択肢はありません。

私が考えることができる唯一の注意点はToList、入力が型List<T>であるかどうかを内部で具体的にチェックし、それへの参照を返す場合です。

しかし、それは既存のコードの多くを破壊するので、決して起こらないでしょう。

于 2013-09-25T10:35:38.057 に答える
1

ドキュメントから:

IEnumerable からリストを作成します

これは新しいインスタンスを意味します。

次を使用して、新しいリストを確実に作成できます。

dim b =New List(Of T)(input) ここinputで IEnumerable(Of T) です

于 2013-09-25T10:41:02.273 に答える
1

このソースに基づいて、そうであると想定しますが、msdn の記事に記載されているクエリが空の場合、空のリストが返されます。

これを反証することができなかったので、本当の答えを見つけるために、これについてさらに調査を行う必要があるかもしれません.

于 2013-09-25T10:34:46.257 に答える