2

私のクラスは を実装してIEnumerable<T>います。クラスは以下も実装します。

void AddRange(IEnumerable<T> items) 
{
    // items can be a deffered query against the collection items being added to
    var itemslist = items.ToList();
    ...processing and adding...
}

しかし、静的コレクションへの変換が適切な設計であるかどうかについては、疑問があります。

たとえば、リスト自体には次のようなものはありません。

var list = new List<int> {1, 2, 3};
list.AddRange(list.Select(i => i+list.Count).ToList());

例外なし。

var list = new List<int> {1, 2, 3};
list.AddRange(list.Select(i => i+list.Count));

InvalidOperationException : 列挙中にコレクションが変更されました。

4

1 に答える 1

1

List<T>.AddRange渡されたシーケンスが実装されているかどうかによって、動作が異なりますICollection<T>。最初のケースでは、をList<T>実装ICollection<T>しているので、AddRangeを呼び出しCopyToて一括コピーを実行できます。2番目の例では、任意のを渡しただけなIEnumerable<T>ので、続行するにはそれを反復処理する必要があります。

基本的に、2番目のケースでは奇妙なことをしています。簡単な答えはそうしないことです。結果が保証されるとは思いません。渡されたシーケンスを熱心に繰り返してからコピーするか、それとも遅延して実行するかは、実装次第です。どちらの実装も、正常なシーケンスで正常に機能します。

于 2012-12-07T11:19:20.293 に答える