MyList
の拡張であるカスタムリストがあり、実行しList
たいIEnumerable(またはIQueryable)があります.ToList()
が、私は推測し.ToMyList()
ます。
ToList()メソッドを実装するにはどうすればよいですか?ToList()のソースコードは、新しいList()を作成し、IEnumerableをパラメーターとして渡すことですが、それがどのように機能するかはわかりません。
MyList
の拡張であるカスタムリストがあり、実行しList
たいIEnumerable(またはIQueryable)があります.ToList()
が、私は推測し.ToMyList()
ます。
ToList()メソッドを実装するにはどうすればよいですか?ToList()のソースコードは、新しいList()を作成し、IEnumerableをパラメーターとして渡すことですが、それがどのように機能するかはわかりません。
クラスがサブクラスList<T>
であり、正しいコンストラクターを提供する場合、次のことができるはずです。
MyList<MyType> list = new MyList<MyType>(theEnumerable);
のような単純な拡張メソッドが必要な場合はEnumerable.ToList
、独自のメソッドを作成できます。
public static MyList<T> ToMyList<T>(this IEnumerable<T> theEnumerable)
{
return new MyList<T>(theEnumerable);
}
次に、次の方法でこれを呼び出すことができます。
var list = theEnumerable.ToMyList();
一般に、サブクラス化List<T>
は実際にはあまり良い考えではないことに注意してください。代わりに、カスタムコレクションが必要な場合は、サブクラス化Collection<T>
と実装を検討する必要があります。IList<T>
必要に応じて、同じコンストラクターを提供し、上記のメソッドを使用してカスタムコレクションにデータを設定することもできます。
基本クラスがあり、リストの作成をそのコンストラクターに委任できる場合は、次のようにします。
public MyList(IEnumerable<MyType> items) : base(items) { }
それ以外の場合、このコンストラクターはほとんどすべてのコレクションクラスで機能するはずです。
public MyList(IEnumerable<MyType> items)
{
if (items == null)
throw new ArgumentNullException("items");
foreach (var item in items)
Add(item);
}
次に、拡張メソッドを作成するか、このコンストラクターを直接呼び出して、シーケンスから新しいリストを作成できます。