LINQはどのような問題領域のために作られていますか?


12

C#のStack Overflowに投稿された質問を見るたびに、LINQの問題を解決する少なくとも1つまたは2つの回答が投稿されます。通常、非常に高い評価を得ている人々は、プロのようにLINQを使用しているようです。

だから私の質問は、どの問題ドメインがLINQを使用することになっていますか?

サイドノートにも:それを避けるべき目的はありますか?データセットのサイズはLINQクエリのパフォーマンスに影響しますか?



次に、こちらにアクセスしてください:msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx
Oded

1
LINQは、オブジェクトグラフのクエリ用です。これは、言語統合クエリです-コレクションをクエリおよび操作できます。
Oded

1
それはおそらく閉ざされた質問であり、linqがどのような問題に適しているかについては、そこに潜む良い質問があるかもしれません
jk。

1
Linqは宣言型です。「方法」を指定せずに、「何」を指定します。linqの場合、クエリを使用して必要なものを指定できることを意味します。宣言的なコードは、問題によっては短くなり、理解しやすくなります。
mike30

回答:


16

LINQは、主にデータシーケンスでの純粋な機能クエリと変換を可能にするように設計されています(すべてのLINQ拡張機能は、Funcデリゲートを受け取りますが、Actionデリゲートは受け取りません)。その結果、LINQにうまく適合しないループの最も一般的なケースは、純粋でない機能的な副作用に関するものです。

foreach(var x in list) Console.WriteLine(x);

LINQの使用を改善するには、使用方法を練習してください。

コレクションで何かを行うためにforor foreachループを作成しようとするたびに、停止し、LINQに適しているかどうかを検討します(つまり、要素に対してアクション/副作用を実行するだけではありません)。 LINQを使用します。

foreach最初にバージョンを記述してから、LINQバージョンに書き換えることもできます。

svickが指摘しているように、LINQはプログラムをより読みやすくすることを目的としています。メカニズムよりもコードの意図を強調する傾向があるため、通常はこの方法が適しています。ただし、単純なループよりもクエリを読みやすくすることができない場合は、ループに固執してください。

練習に演習が必要な場合、ほとんどの関数型プログラミング演習はLINQにうまくマッピングされます。たとえば、99個の問題(特に最初の20個程度)やプロジェクトeulerなどです。


今、この質問を削除する必要があるかもしれません。モデレーターは、コミュニティに適さないとコメントしました。そうでない場合は、教えてください。
user1816120

1
LINQに書き直しても元のテキストがさらに読みやすい場合は、元のままにして、LINQバージョンを削除することを追加します。時々、LINQは何も追加しません。
svick

@svick理論上はい、私はこれの例を考えることができるかどうかわかりません;)
jk。

1
@jk。たとえば、ReSharperでは、を使用してループをLINQに変換することがありますAggregate()。ほとんどの場合、ループは読みやすいと思います。
svick

@svickはおそらくあなたが慣れているものの問題ですが、aggregateはfold
jkの

1

編集された質問に答えるには、要するに、「クエリ」機能を実装する必要があるときはいつでもLINQを使用することが有益です(これがLINQのQの略です)。正確なドメインを定義することは困難ですが、コレクションからのデータの抽出と操作に関連するさまざまなタスクを大幅に簡素化します。

少し詳しく説明すると、多くのクエリ機能が言語(または、さまざまなLINQインプリメンター)に直接組み込まれているため、集計、順序付け、グループ化、フィルター処理、射影、結合(およびその他)がすべて処理されます君は。LINQベースのソリューションは、通常、「手作業で」実装する場合よりもはるかに短く、その意図をはるかによく伝えます。

LINQの威力を伝えるのに役立つことが多い簡単な例は、ディレクトリの内容を拡張子別にグループ化して表示することです。あなたの頭の中の典型的な命令型の実装を実行してください-実装の詳細はすでに最初にあります。おそらくDictionary<String, List<String>>、拡張子を使用してファイルのインデックスを作成するためにa を使用します。もちろん、キーが既に存在するかどうかをチェックし、リストをインスタンス化し、リストに追加する必要があります。次のようになります。

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

同等のLINQを考えてみましょう。

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

クエリ自体は2行しかないことに注意してください。これは、私たちが考え出した命令型のソリューションよりも確かに短いものです。また、かなり読みやすいです。信号対雑音比は、最初のソリューションよりも高くなっています。LINQが初めての場合は、次のようにそのクエリの結果を出力します。

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

より複雑な例では、通常、違いはさらに大きくなります(たとえば、単純に複数のフィールドでグループ化することを検討してください)。したがって、要約すると、LINQは多くの「日々の」データクエリの問題を、より短く、より自己記述的な方法で解決します。これには、構文と技術を習得しなければならないというわずかなコストが伴いますが、マイナス面よりもメリットの方が大きく上回ります。


マップまたはフォールドを「クエリ」として分類しますか?私は本当にそうではありませんが、多分それを見ることができると思います。私は通常、「クエリ」ではなく、計算の結果として集計を考えるだろう
ジミーホッファ

@JimmyHoffa私は主に、必ずしも計算そのものではなく、基礎となるコレクションへの計算の適用について言及しています。しかし、おそらく私のアナロジーには大きな穴があり、それは100%正確というよりも説明のためのものです。
ダニエルB

クエリがで開始することが何であるかの厳密な定義がある場合@JimmyHoffaには、その後私はわからないん
JK。

0

リレーショナルデータベース用のSQLやXML用のXQueryなど、さまざまなタイプのデータソース用にさまざまな言語が開発されてきました。したがって、開発者は、サポートする必要のあるデータソースまたはデータ形式の種類ごとに新しいクエリ言語を学習する必要がありました。LINQは、さまざまな種類のデータソースおよび形式にわたってデータを操作するための一貫したモデルを提供することにより、この状況を簡素化します。LINQクエリでは、常にオブジェクトを操作しています。詳細については、http://msdn.microsoft.com/en-us/library/bb397906.aspxをご覧ください。


まさにLINQは、コレクションを操作するための抽象化APIです。いくつかの重要な利点:C#を使用すると、静的になります!クエリと変換の検証
AndreasScheinert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.