あるタイプのオブジェクトのリストを読み取り、異なるタイプのオブジェクトのリストを作成するforeachループがあります。ラムダ式でも同じ結果が得られると言われました。
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
助けていただければ幸いです-私はラムダとlinqに新しいですありがとう、
以下を試してください
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
これは、LambdasとLINQの組み合わせを使用してソリューションを実現しています。 Select関数は、渡されたデリゲート(この場合はラムダ)を元のコレクションのすべての値に適用する投影スタイルのメソッドです。結果は新しいIEnumerable<TargetType>
で返されます。 .ToList呼び出しは、このIEnumerable<TargetType>
をList<TargetType>
に変換する拡張メソッドです。
あなたがknowをList<T1>
からList<T2>
に変換したい場合、 List<T>.ConvertAll
はSelect
/ToList
よりもわずかに効率的です開始する正確なサイズ:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
ソースをIEnumerable<T>
としてのみ知っているより一般的なケースでは、Select
/ToList
を使用する方法があります。あなたもcouldでしたが、LINQを使用する世界では、開始するのがより慣用的だと主張しています...しかし、少なくともConvertAll
オプションに注意する価値があります.
var target = origList.ConvertAll(x => (TargetType)x);
List<target> targetList = new List<target>(originalList.Cast<target>());
私はこのようなことがうまくいくと信じています:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
以下に簡単な例を示します。
List<char> c = new List<char>() { 'A', 'B', 'C' };
List<string> s = c.Select(x => x.ToString()).ToList();
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
変換するプロパティが複数あると仮定します。
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 })
同様のタイプのクラス。
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
関数を使用してキャストする必要がある場合:
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();
}
または、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
行はよりソフトです! ;-)