LINQを触ってみる - C#

せっかく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になる。つまりint[]ではないということ。

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:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts