【C#】List型とLINQ(入門編)

スポンサーリンク

C#で開発しているとLINQ(リンク)を使っている人のソフトを読み解く場面に出会うかもしれません。
また使いたい場面に出くわすかもしれません。
今回は、LINQを使えない人向けの入門として、『LINQの基礎』を記事にしたいと思います。

自分が今までなぜLINQを毛嫌いしているかというと【データベースをやってる感じで読みづらいが理由として上がるでしょう。
そんな自分と同じような人でも『LINQを理解してもらいたいッッ!』って気持ちで説明していきたいと思います。

LINQ(統合言語クエリ)とは

マイクロソフトのドキュメントには、下記のように書かれています。

統合言語クエリ (LINQ) は、C# 言語への直接的なクエリ機能の統合に基づくテクノロジのセットの名前です。 これまでは、データに対するクエリは、コンパイル時の型チェックや IntelliSense のサポートがない単純な文字列として表現されてきました。 さらに、SQL データベース、XML ドキュメント、さまざまな Web サービスなど、各種データ ソースの異なるクエリ言語を学習する必要があります。 LINQ では、クエリは、クラス、メソッド、イベントと同様に、ファースト クラスの言語コンストラクトです。

クエリを記述する開発者にとって、最も目立つ LINQ の “統合言語” 部分は、クエリ式です。 クエリ式は、宣言型の “クエリ構文” で記述されます。 クエリ構文を使用することで、フィルター処理、並べ替え、グループ化などのデータ ソースに対する操作を、最小限のコードで実行できます。 同一の基本的なクエリ式のパターンを使用して、SQL データベース、ADO .NET データセット、XML ドキュメントとストリーム、および .NET コレクション内のデータを照会して変換できます。

C# の統合言語クエリ (LINQ) | Microsoft Docs

何を書いているか全くわかりません。。。
LINQって日本語で言うと「統合言語クエリ」らしいって事は分かりましたw

統合言語クエリ[Language INtegrated Query]

書いてある内容を簡易的にとらえると

様々なデータソース(データ元)に対して、統一的な手段のアクセス方法

LINQも1つの手段にすぎないので、基本的な構文(繰り返し文や条件分岐)を使いこなせばLINQを使用しなくても実現は可能です。

クエリ構文とメソッド構文

クエリ構文とメソッド構文とはLINQの書き方です。

サンプルとしてList<int>を準備し、リストの要素を倍したいと思います。

//クエリ構文
List<int> lstSampleQuery = new List<int> { 1, 2, 4, 8, 16 };
var resultQuery = from i in lstSampleQuery select i * 2;
List<int> lstResultQuery = resultQuery.ToList();    //Listクラスへ変換
lstResultQuery.ForEach(i => Console.WriteLine(i));  //結果:2,4,8,16.32

//メソッド構文
List<int> lstSampleMethod = new List<int> { 1, 2, 4, 8, 16 };
List<int> lstResultMethod = lstSampleMethod.Select(i => i * 2).ToList();
lstResultMethod.ForEach(i => Console.WriteLine(i)); //結果:2,4,8,16.32

クエリ構文で書いた場合は、型を厳密に指定しません。その為、暗黙的な型[var型]を使用します。

メソッド構文で記載する場合は、ラムダ式で記載する必要が出てきます。
C#をやっている人の場合、メソッド構文の方が使いやすいと思いますので、メソッド構文で紹介していきたいと思います。

LINQの使い方

実は知らず知らずのうちに使っているLINQのメソッドを紹介します。
他にもありますが、一部紹介です。

All()
  すべての要素が条件に合致するか
■Any()
  条件に合致した要素があるかないか
■Average()
  平均値を取得する
■Count()
  要素の数を取得
■LongCount()
  要素の数を取得[long型]
■First()
  最初の要素を取得
■Last()
  最初の要素を取得
■Max()
  最大値を取得
■Min()
  最小値を取得
■Sum()
  合計値を取得

サンプルとしては下記のようになります。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

//全ての要素が5以上か?
Console.WriteLine(lstSample.All(i => 5 <= i));  //結果:False

//5以上の要素が1つでもあるか?
Console.WriteLine(lstSample.Any(i => 5 <= i));  //結果:True

//平均を求める(書き方はどちらでもよい)
Console.WriteLine(lstSample.Average());         //結果:6.2
Console.WriteLine(lstSample.Average(i => i));   //結果:6.2

//要素数を取得する
Console.WriteLine(lstSample.Count());           //結果:5
Console.WriteLine(lstSample.LongCount());       //結果:5

//5以上の要素数を取得する
Console.WriteLine(lstSample.Count(i => 5 <= i));        //結果:2
Console.WriteLine(lstSample.LongCount(i => 5 <= i));    //結果:2

//最初の要素
Console.WriteLine(lstSample.First());           //結果:4

//最後の要素
Console.WriteLine(lstSample.Last());            //結果:8

//最大値
Console.WriteLine(lstSample.Max());             //結果:16

//最小値
Console.WriteLine(lstSample.Min());             //結果:1

//合計値
Console.WriteLine(lstSample.Sum());             //結果:31

まとめ

LINQについて、基礎的な内容を紹介しました。
次回以降は、LINQのメソッドを1つずつ紹介していきたいと思います。
ラムダ式の記載方法の時もそうでしたが、LINQを覚える事でコード量を減らす事が出来ます。

LINQのデメリットを述べるのであれば、統一の処理になっている為、自由度はありません
デメリットの反面で、処理の意図を伝える意味ではとても良い記載方法だと思います。

また最後になりましたが、LINQを使う為にNameSpaceを定義しないといけません。
生成時にデフォルトで書かれているとは思いますが、LINQが使えない時は、確認してみてください。

using System.Linq;

コメント

タイトルとURLをコピーしました