1

MyListの拡張であるカスタムリストがあり、実行しListたいIEnumerable(またはIQueryable)があります.ToList()が、私は推測し.ToMyList()ます。

ToList()メソッドを実装するにはどうすればよいですか?ToList()のソースコードは、新しいList()を作成し、IEnumerableをパラメーターとして渡すことですが、それがどのように機能するかはわかりません。

4

2 に答える 2

6

クラスがサブクラス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>必要に応じて、同じコンストラクターを提供し、上記のメソッドを使用してカスタムコレクションにデータを設定することもできます。

于 2012-09-21T16:00:42.620 に答える
0

基本クラスがあり、リストの作成をそのコンストラクターに委任できる場合は、次のようにします。

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);
}

次に、拡張メソッドを作成するか、このコンストラクターを直接呼び出して、シーケンスから新しいリストを作成できます。

于 2012-09-21T16:08:35.720 に答える