せっかく2008で書いてるんだからと「ちょっとLINQを試してみるか」的な感覚で。
とは言いつつも、デリゲートのお勉強 → ラムダ式 → LINQみたいな感じでたどり着いてしまったわけで、大した知識はもちろん... ない。
例えば、こんな配列があると想定して
int[] nums = { 5, 2, 3, 4, 5, 6, 11, 52, 7, 34, 87 };
Average
int配列の平均値を出す
Console.WriteLine( "配列の平均値 :{0}", nums.Average());
Sum
int配列の合計値を出す
Console.WriteLine("配列の合計値 :{0}", nums.Sum());
Where
条件に一致する値を返す
下の例では平均値以上の値を抽出。
var upper = nums.Where(num => num > nums.Average());『upper』の型はIEnumerable
Cast
キャストする
上記の例の変数 upper をint配列にキャストする。
Array.ForEach(upper.Cast<int>().ToArray(), i => Console.WriteLine(i));int配列にムリクリキャストしてArray.ForEachを使用しています。
この場合「ToArray()」を忘れずに。
Reverse
逆順に並べ替える
IEnumerable<int> reverseNums = nums.Reverse();numsの場合「87,34,7,52,...」となる。
Distinct
重複する値を削除
IEnumerable<int> DistinctNums = nums.Distinct();numsの場合、5が一つ重複しているので後から出現する方の5が削除される。
合わせ技1
上記を組み合わせて使用する
var wdNums = nums .Where(num => num < nums.Average()) .Distinct();これは処理についてではなく、こういう書き方が分かりやすいらしい。
合わせ技2
SQLっぽい書き方で
var woNums = from n in nums where n < nums.Average() + 15 && n > nums.Average() - 15 orderby n descending select n;こういう書き方が望まれてる(?)、あるいは一般的なんでしょうか。
orderbyの昇順/降順の指定は「ascending」がdefaultなのでこちらを選ぶ場合は「orderby n」とし、ascendingの指定を省略可能。
0 Comments:
コメントを投稿