ある型のオブジェクトのリストを読み込んで、異なる型のオブジェクトのリストを生成する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<TargetType>
で返されます。 .ToListの呼び出しは、このIEnumerable<TargetType>
をList<TargetType>
に変換する拡張メソッドです。
もし、List<T1>
からList<T2>
に変換したいことが分かっている場合、List<T>.ConvertAll
は、Select
/ToList
よりもわずかに効率が良くなります。なぜなら、開始する正確なサイズを知っているからです。
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
より一般的なケースとして、ソースを IEnumerable<T>
としてしか知らない場合には、Select
/ToList
を使用するのが良いでしょう。LINQがある世界では、最初からSelect
/ToList
を使ったほうが慣用的であるという意見もありますが、少なくともConvertAll
オプションを知っておく価値はあるでしょう。
このようにすればいいと思います。
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});