LINQとは?
LINQ
とは、Language Integrated Query
の略で「リンク」と読み見ます。
コレクションなどのデータの集まりに対して、SQL
のようにデータを問い合わせる機能を
C#
言語内で統一的に使用できるようにした物です。
LINQ
を使うと、コレクションから特定のデータを選択したり、抽出したり、並び替えたり、
などの操作を簡潔に記述できます。
その他
Distinct:重複する要素を除外してユニークな要素を返す
コレクション中に複数含まれている要素を取り除き、各要素1つだけのコレクションを返します。
var numbers = new[] {1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
var distinctNumbers = numbers.Distinct();
foreach (var number in distinctNumbers)
{
Debug.Log(number);
}
distinctNumbers
には、「1,2,3,4,5」だけが含まれています。
Take:要素を取得する
コレクションの先頭から、指定した数だけ取得します。
var numbers = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var takeNumbers = numbers.Take(3);
foreach (var number in takeNumbers)
{
Debug.Log(number);
}
takeNumbers
には、「1,2,3」が含まれています。
Skip:要素をスキップする
文字通り、先頭から指定した個数分読み飛ばしたコレクションを返します。
var numbers = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var skipNumbers = numbers.Skip(3);
foreach (var number in skipNumbers)
{
Debug.Log(number);
}
skipNumbers
には先頭の3つを除いた、「4,5,6,7,8,9,10」が含まれています
Reverse:要素の順序を逆にする
文字通り、コレクションを逆順にしたコレクションを返します。
var numbers = new[] {"A", "B", "C", "D", "E"};
var reverseNumbers = numbers.Reverse();
foreach (var number in reverseNumbers)
{
Debug.Log(number);
}
reverseNumbers
は、「E,D,C,B,A」の順になっています。
Append:要素を末尾に追加する
既存のコレクションの末尾に要素を追加します。
var numbers = new[] { 1, 2, 3 };
var appendNumbers = numbers.Append(7);
foreach (var number in appendNumbers)
{
Debug.Log(number);
}
appendNumbers
には、「1,2,3,7」が含まれています。
Prepend:要素を先頭に追加する
既存コレクションの先頭に要素を追加します。
var numbers = new[] { 1, 2, 3 };
var prependNumbers = numbers.Prepend(0);
foreach (var number in prependNumbers)
{
Debug.Log(number);
}
prependNumbers
には、「0,1,2,3」が含まれています。
ToLookup:要素をグループ化し、キーとグループのコレクションを作成する
Dictionary
と似ていますが、同じキーの複数の要素が許容されるため、複数の要素をグループ化して取得するのに便利です。
Dictionary<キー,List<要素>>
のようなイメージです。
var items = new[]
{
new { Name = "リンゴ", Category = "果物" },
new { Name = "人参", Category = "野菜" },
new { Name = "バナナ", Category = "果物" },
new { Name = "キャベツ", Category = "野菜" },
new { Name = "イチゴ", Category = "果物" },
new { Name = "レタス", Category = "野菜" },
};
var lookup = items.ToLookup(item => item.Category);
foreach (var group in lookup)
{
Debug.Log($"Category: {group.Key}");
foreach (var item in group)
{
Debug.Log($" {item.Name}");
}
}
結果は以下の様になります。
Category
ごとにグループ化されているのが分かります。
元データがArray
やList
で、繰り返しデータにアクセスしたい場合、辞書型のようにグループ化されたデータにアクセスしたい場合に役に立ちます。
元データが変更されなくなったタイミングで、ToLookup
して結果をどこかにキャッシュしておくといいでしょう。
まとめ
今回はLINQ
の若干マイナーだけど役に立つメソッドについて解説しました。
知っておくと役に立つ場面は多いと思います。
今回でLINQ
についての解説は一旦終了ですが、まだ他にも機能はあります。
また機会があったら解説したいと思います。
LINQ
は、検索や集計などを直感的に、また簡潔に記述でき、
コードの可読性とパフォーマンスを高めることが出来ます。
是非、LINQ
のメソッドを活用して効率的な開発に役立ててください!