2009-04-24 4 views
6

私はLINQの周りに頭を浮かべるのに苦労していて、C#で自分のアプリケーションに近いものが見つかるまで数十の例を検索すると、釣り方を教えていないという結論に至りました。MSDNでSelectメソッドのドキュメントを解読するにはどうすればよいですか?

すぐに私がすぐにレンガの壁に当たったドキュメントに戻ってください。

誰かがここでms35nの http://msdn.microsoft.com/en-us/library/bb548891.aspxに表示され、Intellisenseのヒントとして与えられたEnumerable.Selectメソッドを解読してくれますか?

Enumerable.Select(TSOURCE、TResult)メソッド、それが参照する場合に役立ちます(IEnumerableを(TSOURCE>)、のFunc(TSOURCE、TResult))ここで

は、行番号とブレークダウンと同じラインである:

  1. Enumerable.Select
  2. (TSOURCE、TResult)
  3. 方法
  4. (IEnumerableを(TSOURCE>)、
  5. のFunc
  6. (TSOURCE、TResult))

答えて

7

それはあなたが参照してくださいMSDNの記事からの、C#で、このメソッドの定義を見て助けるかもしれない:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

<角括弧を>このジェネリックメソッドの型パラメータを表し、そして私達ができます型パラメーターが何をしているのかを見るだけで、メソッドの目的を調べ始める。;

  • タイプTSource

    Select<TSource, TResult> 
    

    このメソッドは、2つの異なるタイプのSelect取引と呼ばれることを教えてくれる:私たちは、ジェネリックメソッドの名前を見ることで始まる

    そして

  • タイプTResult

はのパラメータを見てみましょう:

  1. 最初のパラメータはIEnumerable<TSource> sourceある - TSource列挙を提供するソース、。
  2. 第2パラメータはFunc<TSource, TResult> selectorです。セレクタ関数はTSourceで、TResultになります。

はその後、我々はその戻り値を見て(これはFuncの定義を探索することによって確認することができます):

IEnumerable<TResult> 

現在、このメソッドはTResult列挙を返します知っています。

を要約すると、我々はTSourceの列挙をとる関数、および個々のTSourceアイテムを取り、TResultアイテムを返し、その後、全体の選択機能がTResultの列挙を返すセレクタ機能を持っています。

例:

具体的にこれを配置するには、TSourceはタイプPerson(名前の人物を表すクラス、年齢、性別など)のものであり、TResultがであることを言うことができますString(人の名前を表す)と入力します。 Selectの機能には、Personのリストと、Personの名前だけが選択されるという機能を指定します。このSelect関数の出力として、人々の名前だけを含むStringのリストが得られます。別に

:元のメソッドのシグネチャからパズルの

最後の部分は、上部に、最初のパラメータの前thisキーワードです。これはExtension Methodsを定義するための構文の一部であり、静的なSelectメソッド(ソース列挙とセレクタ関数を渡す)の代わりに、単にSelectメソッドを呼び出すことができますそれはSelectメソッドを持っていました(そしてセレクタ関数の1つのパラメータだけを渡します)。

これがあなたにとってより明確になることを願っていますか?

5

選択を考えるための方法は、配列の各要素をマッピングするようになります。したがって:

Enumerable.Select<TSource, TResult>:Selectメソッドは、そのソースと結果の型によってパラメータ化され

IEnumerable<TSource>(あなたがマッピングされているものの種類と種類あなたはそれへのマッピングされている):物事の順序が

をマップします

Func<TSource, TResult>:ソースシーケンス

IEnumerable<TResult>

、マッピング結果のシーケンスである結果の各要素に適用されるマッピング機能、。

IEnumerable<string> strings = ints.Select(i => i.ToString()); 

はここでint型

IEnumerable<TSource>IEnumerable<int>)であると i => i.ToString()Func<TSource, TResult>Func<int, string>)です:

たとえば、文字列表現に整数の配列をマッピングする(簡単な例のように)想像できます。

+0

この詳細な回答ありがとうございます。キーワード "メソッド"は単にEnumerable.Selectがメソッドであると言っていますか? 私はこのようなヘルプラインをどのように解読するのですか? –

+0

はい、そうです。 MSDNトピックのタイトルは、メンバの名前、種類(メソッド、プロパティ、イベント、フィールド)、およびオーバーロードされたメソッドの場合、見ているオーバーロードのシグネチャを示しています。 (Enumerable.Selectの場合、マッピング関数の型によって区別される2つのオーバーロードがあります。) – itowlson

0

私は、C# in Depthの後の章では、LINQを説明するのがうまくいくと思います。さらに、本書の残りの部分では、他にも非常に有用なC#の知識を教えています。

+0

Marc、ありがとうございます。私はその本を持っていますが、役に立たないと思います。私は一度話題を理解すれば完璧な意味があると確信しています。 –

+0

@David:ダニエルの答えがC#よりも明確であれば、それを改善するためにどの深さのC#領域を変更すべきかを示唆できますか?私は第2版をまとめるようになっているので、そのようなフィードバックは非常に便利です! –

関連する問題