いてづきブログ

情シスでやってみたことの備忘録

オブジェクトの配列の各要素に同じ処理をする方法

C#で配列やコレクションのすべての要素に処理を行うでググると色々出てくるけど大抵の場合intとかstringみたいな基本型のものだったりする。


こんな感じ。

IEnumerable<int> intAry = new List<int>() { 1, 2, 3, 4, 5 };  
// 各要素を2倍にする
intAry = intAry.Select(x => x * 2);


ところが、あるクラスオブジェクトのコレクションで各要素の何らかの属性に一括で何か処理をしようとすると話が変わってくる。

IEnumerable<Person> list = new List<Person>(){   
        new Person(){
            Code = 1,
            Name = "hoge"
        },
        new Person(){
            Code = 2,
            Name = "moge"
        }
    };

こんなListに対して、各要素のNameの末尾に"moge"をつけようとすると、

// ビルドエラー
list = list.Select(x => x.Name += "moge");

戻り値がIEnumerable<string>と解釈されてビルドエラーになる。


いろいろ試した結果delegateを使えばできるようだ。

list = list.Select(delegate (Person p)
{
    p.Name += "moge";
    return p;
});


LINQは奥が深い…。