web-dev-qa-db-ja.com

ラムダ式を使用して、オブジェクトのリストをあるタイプから別のタイプに変換します

あるタイプのオブジェクトのリストを読み取り、異なるタイプのオブジェクトのリストを作成するforeachループがあります。ラムダ式でも同じ結果が得られると言われました。

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

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

助けていただければ幸いです-私はラムダとlinqに新しいですありがとう、

192
Stratton

以下を試してください

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

これは、LambdasとLINQの組み合わせを使用してソリューションを実現しています。 Select関数は、渡されたデリゲート(この場合はラムダ)を元のコレクションのすべての値に適用する投影スタイルのメソッドです。結果は新しいIEnumerable<TargetType>で返されます。 .ToList呼び出しは、このIEnumerable<TargetType>List<TargetType>に変換する拡張メソッドです。

277
JaredPar

あなたがknowList<T1>からList<T2>に変換したい場合、 List<T>.ConvertAllSelect/ToListよりもわずかに効率的です開始する正確なサイズ:

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

ソースをIEnumerable<T>としてのみ知っているより一般的なケースでは、Select/ToListを使用する方法があります。あなたもcouldでしたが、LINQを使用する世界では、開始するのがより慣用的だと主張しています...しかし、少なくともConvertAllオプションに注意する価値があります.

199
Jon Skeet
var target = origList.ConvertAll(x => (TargetType)x);
47
Alp
List<target> targetList = new List<target>(originalList.Cast<target>());
28
Pranav

私はこのようなことがうまくいくと信じています:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
12
Andy White

以下に簡単な例を示します。

List<char> c = new List<char>() { 'A', 'B', 'C' };

List<string> s = c.Select(x => x.ToString()).ToList();
8
Ian P
var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
7
Chris Arnold

変換するプロパティが複数あると仮定します。

public class OrigType{
    public string Prop1A {get;set;}
    public string Prop1B {get;set;}
}

public class TargetType{
    public string Prop2A {get;set;}
    public string Prop2B {get;set;}
}

var list1 = new List<OrigType>();
var list2 = new List<TargetType>();

list1.ConvertAll(x => new OrigType { Prop2A = x.Prop1A, Prop2B = x.Prop1B })
2
Max Chu

同様のタイプのクラス。

List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));

0
Arun Solanki

関数を使用してキャストする必要がある場合:

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list2 = list1.ConvertAll(x => myConvertFuntion(x));

私のカスタム関数は次のとおりです。

private Type2 myConvertFunction(Type1 obj){
   //do something to cast Type1 into Type2
   return new Type2();
}
0
jaimenino

または、constructorおよびlinkを使用したSelectを使用して:

public class TargetType {
  public string Prop1 {get;set;}
  public string Prop1 {get;set;}

  // Constructor
  public TargetType(OrigType origType) {
    Prop1 = origType.Prop1;
    Prop2 = origType.Prop2;
  }
}

var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();  

Link行はよりソフトです! ;-)

0
A. Morel