2009-02-21 6 views

答えて

14

私はLINQ to Objectsが全面的に役立つことがわかりました。

  • あなたは、いくつかのデータ項目
  • あなたは元のコレクションから形成された別のコレクションを、希望のコレクションを持っていますが、変換またはフィルタリングのいくつかの並べ替えの後:それは解決の問題は、かなり一般的です。これはソート、投影、述語の適用、グループ化などです。

これはかなり頻繁に起こる状況です。基本的に1つのコレクション(またはデータのストリーム)を別のコレクションに変換することを含むプログラミングの面白い領域がたくさんあります。そのような場合、LINQを使用するコードは、ほとんどの場合、より短くて読みやすくなります。 LINQをクエリ式の同義語とみなしてはならないことを指摘したいと思います。単一の演算子が必要な場合はthe normal "dot notation" (using extension methods) can often be shorter and more readableです。

LINQ to Objectsが好きな理由の1つは、だからです.LINQ to SQLはデータレイヤーにしか関与しない(またはかなりデータレイヤーになる)LINQ to Objectsすべての種類のアプリケーションに適用されます。ただ、一例として、ここではResultSuite(結果の名前付きコレクション)に(基本的にテストの名前付きコレクションである)TestSuiteを変換し、私のMiniBenchベンチマークの枠組みにおけるラインだ

return new ResultSuite(name, 
    tests.Select(test => test.Run(input, expectedOutput))); 

その後いくつかの特定の「標準」の結果に対してスケーリングするResultSuite必要がある場合は、再び:

return new ResultSuite(name, 
    results.Select(x => x.ScaleToStandard(standard, mode))); 

それは、このコードwithoを書くこと難しいではないでしょうLINQではなく、LINQを使うだけで、より明確になり、ループの繰り返しや結果をリストに追加するのではなく、実際の "論理"に集中できます。

LINQ自体は適用されませんが、 LINQのために大部分含まれていた機能(例:暗黙的に型指定されたローカル変数、ラムダ式、拡張メソッド)は非常に便利です。

0

LINQは、いくつかのシナリオではかなり便利です:

  • あなたはより自然に自分のデータにアクセスする(そして上がらないし、代わりに、データテーブルの、入力された「事業者」を使用したいです
  • SQLと似た構文を使って非リレーショナルデータをクエリしたい(これはリストなどを照会するときに便利です)
  • 多くのインラインSQLまたはストアドプロシージャが嫌いです
+0

これは単なるLINQ-to-SQLです。 – MichaelGG

+0

2番目の箇条書きの点はありません - それはLINQ –

0

複雑なデータ型で複雑なフィルタリングを開始するとLINQが再生されます。たとえば、Peopleオブジェクトのリストが表示され、そのリスト内のすべての医師のリストを収集する必要がある場合などです。 LINQを使用すると、単一のLINQステートメントに次のコードを圧縮することができます。

(擬似コード)

doctors = [] 
for person in people: 
    if person is doctor: 
     doctors.append(person) 

(、申し訳ありませんが、私のC#がさびで型チェックの構文は、おそらく間違っている、しかし、あなたが得ますアイデア)

doctors = from person in people where person.type() == doctor select person; 
+0

でリストなどを照会するためのものです。そのような状況では私は照会式を使用しません - 私は人をやっています。人(人=>人は医者です) –

+1

医師= people.OfType () –

5

回答実際にはどこでもが気になります。より良い質問は、ではなく、を使用することです。

+1

OK、HTTPリクエスト、マルチスレッディングをしていますので、何を書いていますか? –

+1

マルチスレッド:PLINQを参照してください。 –

+0

HTTPリクエストを行うのが良い例です。ラムダ構文をLINQの一部として組み込むと(そうでない場合)、コールバックをクロージャとして定義すると、*もっと*簡単になります。 – MichaelGG

0

編集:私が答えた後、私は "LINQ to Objects"と言う変化を見る。しかたがない。

LINQでは、System.Linqのすべての新しい型と新しいコンパイラの機能を参照すると、これらの言語に関数型プログラミングを効果的に追加しています。 (これは主にC# - VBは現在のバージョンでは限られていますが、これは主にC#ですが、これは進歩です)

明白なことは、リスト処理に関連するものは非常に簡単になることです。このスタイルに切り替えるときに "ちょっとした作業"が始まります(LINQのクエリの構文では見つけられませんが)。クエリが非常に複雑で中間値がたくさんある場合を除き、便利です。このような場合、タプルを渡す必要があるすべての問題をソートします。

次に、言語サポート(C# VBの次のバージョンでは匿名メソッドのために多くの構文を書くことができます。オッターウェイ。たとえば、非同期コールバックを処理するメソッド内で非同期コールバックを処理することができます。ここでクロージャーを使用すると、不透明なオブジェクトパラメーターに状態をバンドルして後でキャストする必要がなくなります。

高次関数を使用できるようになると、より一般的に考えることができます。だから、どこにラムダを渡して、より洗練されたものを解決できるかを見てみましょう。この時点で、ジェネリックを使用する場合にのみ実際に機能することが分かります。確かに、これは2.0の機能ですが、関数を渡すときの使用率ははるかに一般的です。

そしてその周りには、リターンが減少するという点があります。宣言してfuncを使用し、すべてのジェネリック型パラメータ(C#とVB)を宣言するコストはかなり高いです。コンパイラはあなたのためにそれを動作させないので、すべて手動で行う必要があります。これは、オーバーヘッドと摩擦の膨大な量を追加します。

これはすべて "LINQ"ですか?おそらくマーケティングに依存します。 LINQプッシュは、C#ではこのスタイルのプログラミングをはるかに容易にし、LINQはすべてFPのアイデアに基づいています。

5

LINQは「滑りやすい斜面」に最適です。多くの一般的な操作に関与しているものを考える:

  • 。 foreachループと "if"を書きます。
  • を選択してください。ターゲットタイプの空のリストを作成し、オリジナルをループし、それぞれを変換して結果に追加します。
  • オーダービー。リストに追加し、.Sort()を呼び出すだけです。またはバブルソートを実装します。)
  • ThenBy(PropertyA、次にPropertyBの順)。かなり難しい。カスタムの比較元と並べ替えはそのトリックを行う必要があります。
  • GroupBy - Dictionary<key, List<value>>を作成し、すべての項目をループします。キーが存在しない場合は作成し、適切なリストに項目を追加します。

これらのそれぞれの場合、手続き的な方法ではLINQの方法より多くのコードが必要です。 "if"の場合、それはもっと数行です。 GroupByやOrderBy/ThenByの場合は、それ以上のことです。

ここではあまりにも一般的なシナリオを使用して組み合わせることにします。あなたは突然LINQの3-4行で解決できる10-20行の方法を見ています。また、LINQのバージョンは(一度LINQに精通すれば)読みやすくなります。

いつLINQを使用しますか?私の答え: "foreach"と表示されるときはいつも:)

関連する問題