LINQとは?

LINQとは、Language Integrated Queryの略で「リンク」と読みます。

コレクションなどのデータの集まりに対して、SQLのようにデータを問い合わせる機能を

C#言語内で統一的に使用できるようにした物です。

LINQを使うと、コレクションから特定のデータを選択したり、抽出したり、並び替えたり、

などの操作を簡潔に記述できます。

変換系

変換系のメソッドを使用すると、コレクション中のデータを変換できます。

Select

各要素に変換処理を施し、新しいコレクションを生成します。

int[] numbers = {0, 1, 2, 3, 4};
var newNumbers = numbers.Select(n => n * n);

以下の場合は、データクラスの中から名前だけ取り出してコレクションを生成します。

var names = users.Select(user => user.Name);

SelectMany

各要素が複数の要素に変換される場合に使用します。

var words = new[] { "hello", "world" };
var characters = words.SelectMany(word => word.ToCharArray());

foreach (var c in characters)
{
    Debug.Log(c);
}

親と子供の名前を組み合わせた以下の様なコレクションがあったとします。

var families = new[]
{
    new { Name = "ヤマダ", Children = new[] { "タロウ", "ジロウ" } },
    new { Name = "ナカノ", Children = new[] { "ジャン", "ジャック" } }
};

for文を使って全ての子供の名前を書き出したい場合、2重に for文を回す必要がありますが、

SelectManyを使えば以下の様に書くことも出来ます。

var allChildren = families.SelectMany(family => family.Children);

foreach (var child in allChildren)
{
    Debug.Log(child);
}

ゲーム向けだと、装備しているアイテムがそれぞれ複数個の効果を持っているような場合に

効果を結合したコレクションを作ることが出来ます。

var items = new[]
{
    new EquipItem
    {
        _itemName = "鋼の剣",
        _effects = new[]
        {
            new ItemEffect { _effectName = "攻撃力", _effectValue = 15 },
            new ItemEffect { _effectName = "命中率", _effectValue = 90 }
        }
    },
    new EquipItem
    {
        _itemName = "鉄の盾",
        _effects = new[]
        {
            new ItemEffect { _effectName = "防御力", _effectValue = 10 },
            new ItemEffect { _effectName = "回避率", _effectValue = 50 }
        }
    }
};

var allEffects = items.SelectMany(item => item._effects);

まとめ

今回は、変換系のメソッドについて解説しました。

変換系メソッドを使えば、コレクションの中から特定の要素だけ抜き出したり、

別の型に変換したりといったことが簡潔に記述できます。

ゲーム開発にも活かせる出番が多いと思うので是非活用してください。

🔗関連ページ