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ごとにグループ化されているのが分かります。

元データがArrayListで、繰り返しデータにアクセスしたい場合、辞書型のようにグループ化されたデータにアクセスしたい場合に役に立ちます。

元データが変更されなくなったタイミングで、ToLookupして結果をどこかにキャッシュしておくといいでしょう。

まとめ

今回はLINQの若干マイナーだけど役に立つメソッドについて解説しました。

知っておくと役に立つ場面は多いと思います。

今回でLINQについての解説は一旦終了ですが、まだ他にも機能はあります。

また機会があったら解説したいと思います。

LINQは、検索や集計などを直感的に、また簡潔に記述でき、

コードの可読性とパフォーマンスを高めることが出来ます。

是非、LINQのメソッドを活用して効率的な開発に役立ててください!

🔗関連ページ