3

私はこの問題について非常に混乱していて理解できません。Enumerableドキュメントで、私はこれを読みました:

System.Collections.Generic.IEnumerableを実装します

そして、Select()returnのようないくつかのメソッドIEnumerable<TSource>は、それを使用した後のような他のメソッドから使​​用できますWhere()。例:

names.Select(name => name).Where(name => name.Length > 3 );

しかし、Enumerableから継承せず、、なども含まれIEnumerable<T>ていません...IEnumerable<T>Select()Where()

私は間違っていますか?
またはこれには何らかの理由がありますか?

4

6 に答える 6

8

Select()、Where()などは「拡張メソッド」です。インターフェイスはメソッドの実装を提供できないため、「他の場所」で定義する必要があります。

引数リストのキーワード「this」で拡張メソッドを認識できます。例えば:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

IEnumerable<TSource>次の1つのパラメータを持つメソッドであるかのように使用できますFunc<TSource, bool> predicate

于 2010-06-09T08:59:03.793 に答える
0

正解ですが、この文はどうですか?

System.Collections.Generic.IEnumerableを実装します

この文によると、インターフェイスでメソッドを定義し、継承によってクラスにIEnumerable<T>実装する必要があります。それは正しいですか?Enumerable

なぜ継承に対して拡張方法を好むのですか?

于 2010-06-09T13:16:36.653 に答える
0

IEnumerableIEnumerable<T>は、2.0以降のインターフェイスであるの前にありました。

于 2010-06-09T13:21:44.457 に答える
0

「なぜ継承に対して拡張方法を好むのですか?」

Enumerableは、IEnumerableに対する50を超える拡張メソッドを実装する静的クラスです。これにより、プログラマーにコレクションタイプごとにすべてのメソッドを実装させることなく、IEnumerableを実装するタイプでこれらすべての拡張メソッドを使用できます。Enumerableが静的クラスではなくインターフェイスである場合、各コレクションタイプ(List、Dictionary、Setなど)には、これらの拡張メソッドの独自の実装があります。

于 2014-04-29T18:35:41.717 に答える
0

これを解決する方法は、同じ要素のバージョンCast<T>()を返すメソッドを使用して、要素を同じタイプにキャストすることです。IEnumerable<T>

DataTable dt = ...
dt.Rows.Cast<DataRow>().Where()...

RowsはタイプIEnumerableであり、キャスト後はタイプになりIEnumerable<DataRow>ます。これはLINQ拡張メソッドでサポートされています。

于 2016-03-11T06:59:47.200 に答える
-2

さらなる洞察を得るために、この記事のイテレーター、イテレーターブロック、およびJonSkeetによるデータパイプラインも読んでいると言っていました。

于 2010-06-09T09:02:17.813 に答える