LINQとは?
LINQ
とは、Language Integrated Query
の略で「リンク」と読みます。
コレクションなどのデータの集まりに対して、SQL
のようにデータを問い合わせる機能を
C#
言語内で統一的に使用できるようにした物です。
LINQ
を使うと、コレクションから特定のデータを選択したり、抽出したり、並び替えたり、
などの操作を簡潔に記述できます。
参考データ
RPG
におけるアイテムをイメージしたクラスを用意しました。
public class Item
{
public string Name;
public bool CanEquip;
public int AttackPower;
public int SellPrice;
}
これを元に以下の様にデータを設定しておきます。
var items = new[]
{
new Item("鋼の剣", true, 15, 100),
new Item("回復薬", false, 0, 10),
new Item("魔法の杖", true, 12, 200),
new Item("鉄の盾", true, 5, 75),
new Item("火炎瓶", false, 0, 30),
new Item("銀の弓", true, 18, 150),
new Item("毒消し", false, 0, 20),
new Item("黄金の鎧", true, 25, 300),
new Item("氷の指輪", true, 8, 120),
new Item("エリクサー", false, 0, 500)
};
表にすると以下の様なイメージです。
並び替え
ゲームにおいて、なんらかのコレクションがあると並び替えたい場合があります。
例えば、
- 所持アイテム一覧を売却価格順にしたい
- 装備可能な武器を攻撃力順にしたい
- 行動順を決めるのに素早さの高い順に並び替えたい
などです。
参考までに表をPrice
の昇順で並び替えると以下の様になります。
OrderBy:昇順に並び替える
OrderBy
メソッドに並び替える条件になる式を渡すことで、コレクションを昇順(小さい順)に並び替えることが出来ます。
// 売却価格の小さい順
var sortedList = items.OrderBy(item => item.SellPrice);
foreach (var item in sortedItems)
{
Debug.Log($"{item.Name} : {item.SellPrice}");
}
ログを確認すると以下の様になります。
OrderByDescending:降順に並び替える
OrderByDescending
メソッドに並び替える条件になる式を渡すことで、コレクションを降順(大きい順)に並び替えることが出来ます。
// 攻撃力の大きい順
var sortedItems = items.OrderByDescending(item => item.AttackPower);
foreach (var item in sortedItems)
{
Debug.Log($"{item.Name} : {item.AttackPower}");
}
ログを確認すると以下の様になります。装備できないものも含まれていますが。
ThenBy / ThenByDescending:二つ目の並び替え条件を設定する
ThenBy
,ThenByDescending
を使うことで、二つ目の並び替え条件を設定することが出来ます。
// 攻撃力が高く、売却価格が安い順
var sortedItems = items.OrderByDescending(item => item.AttackPower).ThenBy(item => item.SellPrice);
foreach (var item in sortedItems)
{
Debug.Log($"{item.Name} : 攻撃力 {item.AttackPower} : 売却価格 {item.SellPrice}");
}
ログを確認すると以下の様になります。
全体は攻撃力の高い順、攻撃0のアイテムは価格が安い順になっているのが確認出来ます。
集計
LINQ
を使用して、コレクションの中の要素を集計することも出来ます。
Count:要素の数を数える
条件に基づいて要素の数を数えます。
var count1 = items.Count();
var count2 = items.Count(item => item.CanEquip);
count1
には単純にコレクションの要素数が返ってきます。
count2
には条件式を渡しているので、装備可能なアイテムの数が返ってきます。
Sum:要素の合計を求める
条件に基づいて要素の合計値を求めます。
var sum1 = items.Sum(item => item.SellPrice);
var sum2 = items.Sum(item => item.AttackPower);
それぞれ条件式に従って、売却価格と攻撃力の合計が返ってきます。
Average:要素の平均を求める
条件に基づいて要素の平均値を求めます。
var average = items.Average(item => item.SellPrice);
条件式に従って、売却価格の平均が返ってきます。
Min:要素の最小値を求める
条件に基づいて要素の最小値を求めます。
var min = items.Min(item => item.AttackPower);
条件式に従って、最小の攻撃力が返ってきます。
Max:要素の最大値を求める
条件に基づいて要素の最大値を求めます。
var max = items.Max(item => item.AttackPower);
条件式に従って、最大の攻撃力が返ってきます。
まとめ
今回は、LINQ
の機能のうち、並び替えと集計について解説しました。
並び替えも集計もfor
文を使うより簡潔に記述できます。
ゲームを開発していると、単純にアイテムやキャラクター一覧の画面で、
特定の条件で並び替えたい場面があると思いますが、
並び替え用メソッドは役に立ちます。
また、
- 売ろうとしているアイテムの売却価格の合計を求める
- パーティの
HP
の合計を知りたい
といった集計用メソッドの出番もあると思います。
検索用メソッドと組み合わせれば、
大量のデータから特定の要素を取り出してから並び替える、集計するということも出来ます。
機会があれば活用してみてください。