ラムダ式を使ってオブジェクトのリストをある型から別の型に変換する

ある型のオブジェクトのリストを読み込んで、異なる型のオブジェクトのリストを生成するforeachループがあります。ラムダ式でも同じ結果が得られると聞きました。

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}

ラムダやLINQは初めてなので、何かアドバイスがあればお願いします。 ありがとうございます。 s

以下をお試しください。

var targetList = origList
  .Select(x => new TargetType() { SomeValue = x.SomeValue })
  .ToList();

これは、ラムダとLINQを組み合わせてソリューションを実現しています。 Select関数はプロジェクション形式のメソッドで、渡されたデリゲート(この場合はラムダ)を元のコレクションのすべての値に適用します。 その結果は、新しい IEnumerable で返されます。 .ToListの呼び出しは、このIEnumerableListに変換する拡張メソッドです。

解説 (1)

もし、ListからListに変換したいことが分かっている場合、List.ConvertAllは、Select/ToListよりもわずかに効率が良くなります。なぜなら、開始する正確なサイズを知っているからです。

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

より一般的なケースとして、ソースを IEnumerable としてしか知らない場合には、Select/ToList を使用するのが良いでしょう。LINQがある世界では、最初からSelect/ToListを使ったほうが慣用的であるという意見もありますが、少なくともConvertAllオプションを知っておく価値はあるでしょう。

解説 (5)

このようにすればいいと思います。

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
解説 (1)