UnityでLINQを使って楽をする
LINQを使うとデータ処理を簡単に行うことができます。 全体のコードは以下のリポジトリにありますので、別記事の UniRxを使ってみる も合わせてご覧ください。
What's LINQ?
C# の統合言語クエリ (LINQ) | Microsoft Docs
LINQの詳しい解説は他のサイトに譲るとして、ここではサンプルコードを記載します。実際に実行して挙動を確認してみると理解が進むはずです。
LINQ Operators
Average
平均値を抽出
using System.Linq; double average = new List<int> { 0, 1, 2, 3 }.Average(); Debug.Log(average); // 1.5
Min
最小値を抽出
using System.Linq; int min = new List<int> { 21, 9, 15, 3, 8, 11 }.Min(); Debug.Log(min); // 3
Max
最大値を抽出
using System.Linq; int max = new List<int> { 5, 9, 15, 3, 21, 8, 11 }.Max(); Debug.Log(max); // 21
Sum
合計値を算出
using System.Linq; int sum = new List<int> { 1, 2, 3, 4, 5 }.Sum(); Debug.Log(int); // 15
Where
条件式がTrueとなる要素で再構成します。
using System.Linq; var list = new List<int> { 1, 2, 3, 4, 5 }.Where(x => x > 2); Debug.Log(string.Join(", ", list)); // { 3, 4, 5 }
Select
式を評価した値で再構成します。
using System.Linq; var list = new List<int> { 1, 2, 3, 4, 5 }.Select(x => x * x); Debug.Log(string.Join(", ", list)); // { 1, 4, 9, 16, 25}
メソッドチェーン
メソッド(オペレータ)を連結することで連続して処理することができます。
using System.Linq; var list1 = new List<int> { 1, 2, 3, 4, 5 }; var list2 = list1.Where(x => x > 2); var list3 = list1.Where(x => x > 2).Select(x => x * x); Debug.Log(string.Join(", ", list1));// { 1, 2, 3, 4, 5 } Debug.Log(string.Join(", ", list2));// { 3, 4, 5 } Debug.Log(string.Join(", ", list3));// { 9, 16, 25 }
(foreach)
foreachはLINQではありませんが、要素を取り出す操作としてLINQと組み合わせて使うこともできます。
var list = new List<int> { 1, 2, 3, 4, 5 }; list.ForEach(x => Debug.Log(x * x)); // 1, 4, 9, 16, 25 // list.ForEach(x => { // Debug.Log("-----"); // Debug.Log(x * x); // });