2009-07-12 10 views
23

IList <の文字列>を使用して、文字列配列(String []型)の値をオブジェクトに追加するだけの状況です。 MSDNのクイックルックアップにより、IList <T>のInsertメソッドは、インデックスとオブジェクトTをとり、Tの代わりにIEnumerable <T>を持つバージョンしかないことが明らかになりました。宛先リストに値を入れるために入力リストにループを書く必要がありますか?そうだとすれば、私にとっては非常に限定的で、むしろ非常に非友好的なAPIデザインのようです。たぶん、私は何かを欠いている。この場合、C#の専門家は何をしますか?IList <T>にIEnumerableを取るInsertメソッドがない理由<T>?

答えて

38

インタフェースは一般に、実装者の負担を軽減するために、使用可能にするために必要な機能性が最も低いためです。 C#3.0では、これを拡張メソッドとして追加できます。

public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) { 
    if(list == null) throw new ArgumentNullException("list"); 
    if(items == null) throw new ArgumentNullException("items"); 
    foreach(T item in items) list.Add(item); 
} 

et voila;

IList<string> list = ... 
string[] arr = {"abc","def","ghi","jkl","mno"}; 
list.AddRange(arr); 
+7

は、あなたがそれを行うことができますが、そのは、そのリスクを持っているあなたはAddRangeを呼び出すとき、あなたは基礎となるオブジェクトは、それが範囲で動作していることをいくつか理解していることを期待することがあります。IList<T>は今AddRangeを持っています。データバインディングのシナリオでは、これにより1つのイベントで十分であったシナリオで何千ものイベントが発生する可能性があります。 @Sam; –

+0

;確かに; IList を使用して行うことができるのが最善です。もちろん、補償する方法があります... –

+1

答えをくれてありがとうMarc。私はまだインターフェイスが、リストを別のリストに追加することがそのような共通の操作であることを考慮して、実装性の容易さ以上にユーザビリティが重視されるように設計されるべきであると感じています。とにかく、この場合は拡張メソッドがうまく機能するので、大騒ぎにはならないかもしれません。 – Kei

関連する問題