ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

LINQによる配列操作

家にはmacchromebookしかないのでc#とは関わりがないのですが
会社に行くとc#を書くお仕事なので、c#の特徴でもあるLINQについて調べたことをjsと比較しながら学びたいと思います

LINQの種類

メソッド式

var ary = {1, 2, 3};
var result = ary.Where(x => x % 2 == 0).Select(x => x * 2);
Console.WriteLine(result);//=> [4]

以下のように改行してもいい

var result = ary
    .Where(x => x % 2 == 0)
    .Select(x => x * 2);

クエリ式

var ary = {1, 2, 3};
var result = (from x in ary where x % 2 == 0 select x * 2);
Console.WriteLine(result);//=> [4]

()で囲む必要はないが書いてた方が見やすい気がする
囲わないとこんな感じ

var result = from x in ary where x % 2 == 0 select x * 2;

これも改行してもちゃんと動く

var result = from x in ary
    where x % 2 == 0
    select x * 2;

js arrayメソッド対応表

javascript c#
map Select
filter Where
reduce Aggregate
forEach

LinqのメソッドにforEachはない
Linq style “For Each” - Stack Overflowによると、ToListListに変換してからList#ForEachを使うとできる
しかしToListListに変換するのは効率が良くないので、できれば Reactive を使って実装するのが良いらしい

Aggregate(reduce)の使い方

aggregate
【動詞】【他動詞】
〈…を〉集合する,集める,集団とする.
【自動詞】
1 集まる.
2〔+補語〕総計〈…と〉なる.

(引用: weblio)

「配列の要素を全部足す」のような集約をするための関数

型定義

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source,
    TAccumulate seed,
    Func<TAccumulate, TSource, TAccumulate> func
)

(引用: Enumerable.Aggregate - MSDN)

実行例

var ary = {1, 2, 3};
var result = ary.Aggregate(0, (sum, x) => sum + x);
Console.WriteLine(result);//=> 6

var result2 = ary.Aggregate(4, (sum, x) => sum + x);
Console.WriteLine(result2);//=> 10