C#のStack Overflowに投稿された質問を見るたびに、LINQの問題を解決する少なくとも1つまたは2つの回答が投稿されます。通常、非常に高い評価を得ている人々は、プロのようにLINQを使用しているようです。
だから私の質問は、どの問題ドメインがLINQを使用することになっていますか?
サイドノートにも:それを避けるべき目的はありますか?データセットのサイズはLINQクエリのパフォーマンスに影響しますか?
C#のStack Overflowに投稿された質問を見るたびに、LINQの問題を解決する少なくとも1つまたは2つの回答が投稿されます。通常、非常に高い評価を得ている人々は、プロのようにLINQを使用しているようです。
だから私の質問は、どの問題ドメインがLINQを使用することになっていますか?
サイドノートにも:それを避けるべき目的はありますか?データセットのサイズはLINQクエリのパフォーマンスに影響しますか?
回答:
LINQは、主にデータシーケンスでの純粋な機能クエリと変換を可能にするように設計されています(すべてのLINQ拡張機能は、Funcデリゲートを受け取りますが、Actionデリゲートは受け取りません)。その結果、LINQにうまく適合しないループの最も一般的なケースは、純粋でない機能的な副作用に関するものです。
foreach(var x in list) Console.WriteLine(x);
LINQの使用を改善するには、使用方法を練習してください。
コレクションで何かを行うためにfor
or foreach
ループを作成しようとするたびに、停止し、LINQに適しているかどうかを検討します(つまり、要素に対してアクション/副作用を実行するだけではありません)。 LINQを使用します。
foreach
最初にバージョンを記述してから、LINQバージョンに書き換えることもできます。
svickが指摘しているように、LINQはプログラムをより読みやすくすることを目的としています。メカニズムよりもコードの意図を強調する傾向があるため、通常はこの方法が適しています。ただし、単純なループよりもクエリを読みやすくすることができない場合は、ループに固執してください。
練習に演習が必要な場合、ほとんどの関数型プログラミング演習はLINQにうまくマッピングされます。たとえば、99個の問題(特に最初の20個程度)やプロジェクトeulerなどです。
Aggregate()
。ほとんどの場合、ループは読みやすいと思います。
編集された質問に答えるには、要するに、「クエリ」機能を実装する必要があるときはいつでも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は多くの「日々の」データクエリの問題を、より短く、より自己記述的な方法で解決します。これには、構文と技術を習得しなければならないというわずかなコストが伴いますが、マイナス面よりもメリットの方が大きく上回ります。
リレーショナルデータベース用のSQLやXML用のXQueryなど、さまざまなタイプのデータソース用にさまざまな言語が開発されてきました。したがって、開発者は、サポートする必要のあるデータソースまたはデータ形式の種類ごとに新しいクエリ言語を学習する必要がありました。LINQは、さまざまな種類のデータソースおよび形式にわたってデータを操作するための一貫したモデルを提供することにより、この状況を簡素化します。LINQクエリでは、常にオブジェクトを操作しています。詳細については、http://msdn.microsoft.com/en-us/library/bb397906.aspxをご覧ください。