【C#】知らないと損する”ゲーム制作”で良く使うLINQメソッド

はじめに

LINQとはコレクション(配列やList、Dictionaryなど)の要素を処理するメソッドを集めたライブラリです。

LINQはメソッドチェイン(関数をドットで繋げて処理を書くもの)で記述できるので処理が完結にかけます。

可読性も良くなるので慣れるととても便利ですよね。

しかし、「あのメソッドの名前なんだっけ?」という事や「このメソッドの意味なんだっけ?」と忘れてしまう事がありませんか?

私はよくあるので、今回はゲーム制作でよく使うLINQメソッドをまとめて紹介したいと思います。

よく使うLinqメソッド

FirstOrDefault

リストから条件に合う要素を検索して最初に合致したものが取得できます。

条件に合うものがなかった場合はnullが返ります。

リストから特定の1つの要素を取得したいという場面ではFirstOrDefaultを使います。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//所持数10個以上の最初にあるアイテム取得
Item item = ItemList.FirstOrDefault(item => item.count >= 10);

上記のコードではアイテムの所持数が10個以上の先頭要素を取得しています。

Where

リストから条件に合う要素を抽出したIEnumerableが取得できます。

特定の条件似合う要素だけを、まとめて取得したいときはWhereを使います。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//typeが1のアイテムを取得
var result = ItemList.Where(item => item.type == 1);

上記のコードはタイプが1(本来はEnumとかで定義)のアイテムだけを抽出しています。

Select

リストの要素に対して指定した変換を行った結果をIEnumerableで取得できます。

クラス内の特定の要素を抽出してリストを作りたい時などに使います。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//アイテムのIdだけ抜き出したIEnumerable取得
var itemIdList = ItemList.Select(item => item.id);

上記のコードではアイテムのリストからIDだけを抽出したリスト(IEnumerable)を取得しています。

他にもリストの要素を使って特定のクラスのリストを作成したい時などにも使います。

var getItemIds = new string[] { "item1", "item3", "item6" };
//アイテムIdからItemクラスのIEnumerableを作成
var itemList = getItemIds.Select(id => new Item(id));

上記のコードではアイテムIdのリストからItemクラスのリスト(IEnumerable)を作成しています。

ToArray・ToList

Linqで複数の結果が返ってくる場合、IEnumerable型で返却されます。

ToArray・ToListを使うと配列・Listに変換できます。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//アイテムのIdだけ抜き出したリストを取得
var itemIdList = ItemList.Select(item => item.id).ToList();
//アイテムのIdだけ抜き出した配列を取得
var itemIdArray = ItemList.Select(item => item.id).ToArray();

OrderBy

指定した要素の基準に昇順に並べ替えた結果を取得できます。

降順に並べたい時はOrderByDescendingを使います。

所持数や強さ順などで並び変えたいときに使います。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//所持数の少ない順に並び替え
var itemList1 = ItemList.OrderBy(item => item.count);
//所持数の多い順に並び替え
var itemList2 = ItemList.OrderByDescending(item => item.count);

またOrderByの引数にGuid.NewGuid()を指定すると、要素をランダムに並べ替えることができます。

配列からランダムに1つ要素を取り出したいときなどに、FirstOrDefaultと組み合わせて良く使います。

//ランダムに並び変えた先頭要素を取得
Item item = ItemList.OrderBy(item => Guid.newGuid()).FirstOrDefault();

そこそこ使うLinqメソッド

Count

条件にあった要素数を返します。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//所持数が10以上のアイテムの数
int itemCount = ItemList.Count(item => item.count >= 10);

Any

特定の条件に合う要素が存在するかをチェックし、bool型で結果を返します。

Anyは一つでも合う要素があればtrue、Allはすべての要素が合っていればtrueになります。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//item1がリスト内に存在するかどうかチェック
bool result = ItemList.Any(item => item.id == "item1");
//すべてのアイテムを2つ以上持っているかどうか
bool result = ItemList.All(item => item.count >= 2);

Take

先頭から指定した数の要素を返します。

最初の〇個目までの要素に処理を行いたい時に使用します。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//所持数の少ない5つを取得
var itemList1 = ItemList.OrderBy(item => item.count).Take(5);

Skip

先頭から指定した数の要素をスキップして返します。

class Item
{
    string id;
    int count;//所持数
    int type;//効果タイプ
}
List<Item> ItemList;//持っているアイテムのリスト

//4個目の要素から少ない順に並べ替え
var itemList1 = ItemList.Skip(3).OrderBy(item => item.count);

まとめ

以上がゲーム制作で良く使うLINQメソッドでした。

とりあえず今回上げたものが使えたら基本はOKだと思います。

LINQを使うと配列の操作がとても便利になるので、ゲーム制作でどんどん使って慣れましょう!

👇あなたにお勧めの書籍

コメント