2017-06-08 21 views
6

私が十分理解している小さなスクリプトが見つかりました。私は "1 -2 5 40"という文字列を持っています。入力文字列を読み込み、それを一時配列に分割します。次に、この配列が解析され、各要素が整数に変換されます。すべてのことは、最も近い整数を0にすることです。C#表記理解Select(int.Parse)

しかし、私が理解できないのは表記です選択(int.Parse)です。ここにラムダ式はなく、メソッドint.Parseは角括弧では呼び出されません。 のOrderBy(Math.Abs​​)と同じ

var temps = Console.ReadLine().Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries); 

var result = temps.Select(int.Parse) 
.OrderBy(Math.Abs) 
.ThenByDescending(x => x) 
.FirstOrDefault(); 

答えて

11

int.Parse)=事前にありがとうござい方法グループある - 何を見ていると、デリゲートにメソッドグループの変換です。 LINQなしでそれを表示するには:あなたが

0

int型:)詳細に入るしたい場合は違いがたくさんがありますが...

Func<string, int> parser = text => int.Parse(text); 

Func<string, int> parser = int.Parse; 
int x = parser("10"); // x=10 

それはとほとんど同等です。構文解析はシグネチャ文字列 - > int(または実際には異なるシグネチャを持つメソッドグループ)を持つメソッドですが、コンパイラはこれが唯一のものであるため、これを必要とすると推測できます。

ouldは、同じシグニチャを持つデリゲートパラメータを指定する場合はいつでも、このメソッドをパラメータとして使用します。

+0

これはなぜこのように使用できるのか説明していません。 –

5

Select(int.Parse)は、Select(x => int.Parse(x))とほぼ同等です。

Selectは、Func<T, R>を要求します。この場合は、int.Parseの署名でもあります(返される値を持つ単一のパラメータがあります)。メソッドグループを一致するデリゲートに変換します。

この場合、Func<T, R>Func<string, int>にマップされるため、int Parse(string)シグネチャと一致します。 T1は、入力パラメータ(tempsの個々の値)であり、そしてT2は戻り型である

0

.Select()ためのパラメータがFunc<T1, T2>()あります。

通常、これはラムダ関数として書かれています:x => return x + 1などです。しかし、ラムダとして書かれていなくても、一般的な定義に適合するメソッドはすべて使用できます。メソッド名は、変数。

したがってFunc<string, int> parseInt = s => Convert.ToInt32(s);は、メソッドint.Parse(s)を呼び出すことと構文的に同等です。

言語は、Funcパラメータを自動的にinsideメソッドに渡してより読みやすいコードを作成するためのショートカットを作成します。

0

選択LINQのIEnumerable <>拡張メソッドのシグネチャは、次のようになります。selector引数で

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

ルック。 >

public static int Parse(
    string s 
) 

.NETコンパイラがのFunc < ...>またはアクション< ...にデリゲートを変換することができます:あなたのケースでは、署名を持っている。ネットの標準機能int.Parseを選択して渡します。これはFuncに変換できるので、Selectメソッドの引数として渡すことができます。

OrderByとまったく同じです。その署名も見てください。