redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

(小ネタ)2重ループをLINQを使って書く

コレクションが二つあって、片方のコレクションの値で、もう片方のコレクションを検索して処理を行う時に、2重ループを使うことがありますが、これはLINQを使用して書くことも出来ます。

C#で解説する「データ処理の直交化と汎用化」 − @IT

ただしサイト内で言われているように、LINQメソッド構文で行う場合はSelectManyメソッドを使用するのですが、使い方と理解するのがなかなか難しい。

クエリ式を使用すると、このケースにおいては、SQLを知っていればだいぶ理解しやすくなるのでクエリ式を使用するのが良いようです。


ちなみに、片方のコレクションに含まれているインスタンスに、もう片方のコレクションのインスタンスの値を代入する場合は、以下のようにforeach文を使用した方が楽な気がします。

foreach (var obj in listB)
{
    var single = listA.SingleOrDefault(o => o.Id == obj.Id);

    if (single == null)
    {
        continue;
    }

    single.prop1 = obj.prop1;
    single.prop2 = obj.prop2;
}