C#のLinqについて、個別のメソッドについて勉強をしてみました。 実際に使えるレベルにまで、もっていかないとせっかくある便利な機能がもったいないので、使いこなせるようにしたい。
Where
条件を設定できる。 [c] // foreach文に記載 foreach (var i in nums.Where(c => c >= 2)) { Debug.LogError ("i:" + i); } [/c]
Select
値を加工する。 [c] foreach (var j in nums.Select(c => c * 2)) { Debug.LogError ("j:" + j); } [/c]
SelectMany
2つのICollection(List,Dictionaryなど)を総当りに計算をする。 [c] int nums = {1, 2, 20, 9 }; int nums2 = { 3, 4};
// x = nums , y = nums2 var hoge = nums.SelectMany *1; foreach (var i in hoge) { Debug.LogError (i); } //1 * 3 = 3 //1 * 4 = 4 //2 * 3 = 6 //2 * 4 = 8 //20 * 3 = 60 //20 * 4 = 80 //9 * 3 = 27 //9 * 4 = 36
[/c]
ToArray()
配列を生成する。 [c] int a = { 30, 2, 12 }; a = a.Select (x => x + 1).ToArray(); foreach (var i in hoge) { Debug.LogError (i); } [/c]
ただし、上記の場合は、配列に格納しなおさなくても、IEnumerable型のままでも同じような処理ができる。 こちらの方法のほうが、若干であるが処理速度が早い。
ToList()
List
[/c]
Count
これは何個の要素があるかを調べることができます。 実は、上記のToArray(),ToList()もそうなのですが、インスタンス化をしています。 ですので、使う用途によっては、Lengthプロパティ(配列)を使ったほうが良い場合がある。 [c] int nums = list.Count (); int nums = list.ToArray ().Length; [/c]
First
条件式に満たした最初の値を取り出す。 [c] int a = { 30, 2, 12 }; var firstNum = b.First (x => x > 2); [/c]
この場合、万が一条件式を満たした値がない場合にNullが返ってきます。 これを防ぐためには FirstOrDefault()を使います。 [c] // デフォルトの0が返ってくる var firstNum = b.FirstOrDefault (x => x > 45); [/c]
Last
最後の値をとるLast()も同じように、条件式を満たした値を返すのだが、こちらは全ての値を判定するのでパフォーマンス的にあまり良くないです。 その場合は、一度ソートをかけ、First()で取得するのが良い。
OrderBy
並び替えを行う。 速度は配列のSort()より遅いので正しく使う必要がある。 元のデータを加工せずに利用したい場合に使う。 [c] // 元データをソートしている Array.Sort (a); foreach (var item in a) { Debug.LogError (item); }
// 元データを加工しない foreach (var item in a.OrderBy(n => n)) { Debug.LogError (item); } [/c]
Any
条件に一致している場合にtrueを返す。 何も要素がない場合でもfalseを返してくれる。 [c] var b = new int{};
// Anyはfalseを、Allはtrueを返すので注意 Debug.LogError (b.Any (x => x == 2)); // false Debug.LogError (b.All (x => x == 2)); // true [/c]
独習C# 第3版 ハーバート・シルト,エディフィストラーニング株式会社 矢嶋聡 翔泳社 売り上げランキング : 16503 Amazonで詳しく見る |
*1:x) => nums2, (x, y) => x + " x " + y + " = " + (x * y