2009-07-07 8 views
166

を呼び出すには、あなたのようなコードを書くことができます。コードと同等の連鎖LINQの拡張メソッドは、C#コンパイラクエリの理解機能を使用

上記のクエリ式で
var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" }; 
var result = 
    from animalName in names 
    let nameLength = animalName.Length 
    where nameLength > 3 
    orderby nameLength 
    select animalName; 

letキーワードが値を許可しますanimalName.Lengthへの重複呼び出しなしに、whereおよびorderby操作に渡されます。

「let」キーワードがここで行うことを実現するLINQ拡張メソッド呼び出しの同等のセットは何ですか?

+11

FYIでは、C#3.0の仕様では、すべてのクエリの読み込みの変換ルールについて非常に悲惨なものが説明されています。 –

+16

と仕様が重くなっている人は、Jon SkeetのC#Depthでそれをカバーしています; -p –

+4

私は「let」というキーワードが拡張メソッドにどのようにマップされているのだろうか? googleそれが私の検索は何かを見つけることは疑いがありますが、ジャンク...だからFTW! – Will

答えて

212

自分で操作しないでください。それはSelectからピギーバックします。既存のdllを分離するために "リフレクター"を使用すると、これを見ることができます。

それは何かのようになります。

var result = names 
     .Select(animalName => new { nameLength = animalName.Length, animalName}) 
     .Where(x=>x.nameLength > 3) 
     .OrderBy(x=>x.nameLength) 
     .Select(x=>x.animalName); 
+2

うわー、私はあなたがそのような新しい演算子を使って自動カプセル化できるかどうか分からなかった。 –

+17

LinqPadの結果ペインにある小さな「ラムダ」ボタンを使って、クエリ可能で始まる場合は生成されたコードを見ることもできます。言い換えれば、最初の行をvar names = new string [] {"Dog"、...}に変更した場合.AsQueryable(); LinqPadですべてを実行し、小さなラムダボタンをクリックすると、生成されたコードがMarcの答えとほぼ同じになります。 –

+1

LinqPadで '.Dump()'拡張メソッドを使って結果のラムダを見る必要がありました。 – justanotherdev

77

良い記事は、基本的にletが匿名タプル​​を作成here

あります。これは次のものと同等です:

var result = names.Select(
    animal => new { animal = animal, nameLength = animal.Length }) 
.Where(x => x.nameLength > 3) 
.OrderBy(y => y.nameLength) 
.Select(z => z.animal); 
+3

ブログが消えたように見える –

+2

今はもうWebアーカイブにリンクしていません。 – Ziv

+0

私は上記の文章を引用しています。「変数を変換する必要がない場合はletキーワードを使用することをお勧めします」 –

5

もSystem.Interactiveで.Let拡張メソッドがありますが、その目的はで評価「イン・ライン」であるとラムダ式を導入することです流暢な表現。たとえば、新しい乱数にそれが実行されますたびに作成し、以下の式(LinqPad、言うには)考えてみます。

var seq = EnumerableEx.Generate(
    new Random(), 
    _ => true, 
    _ => _, 
    x => x.Next()); 

seq.Zip(seq, Tuple.Create).Take(3).Dump(); 
次の点を考慮して、新しいランダムサンプルが毎回現れることを確認するには

は、左右が異なるペアを生成します。左と右のは常に同じである、ペアを生成するには、以下のような何か:私たちは直接、ラムダ式を呼び出すことができれば

seq.Take(3).ToList().Let(xs => xs.Zip(xs, Tuple.Create)).Dump(); 

を、我々は

(xs => xs.Zip(xs, Tuple.Create))(seq.Take(3).ToList()).Dump(); 

を書くかもしれません。しかし、私たちがすることはできませんラムダ式をメソッドであるかのように呼び出します。

関連する問題