람다 식을 사용하여 객체 목록을 한 유형에서 다른 유형으로 변환
한 유형의 객체 목록을 읽고 다른 유형의 객체 목록을 생성하는 foreach 루프가 있습니다. 람다식이 동일한 결과를 얻을 수 있다고 들었습니다.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
도움이 될 것입니다-나는 lambda와 linq를 처음 사용합니다.
다음을 시도하십시오
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
솔루션을 달성하기 위해 Lambdas와 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가있는 세계에서 시작하는 것이 관용적이라고 주장 할 수 있습니다. 그러나 적어도 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 })
캐스트하기 위해 함수를 사용해야하는 경우 :
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
라인은 더 부드럽고! ;-)
for similar type class.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
'Programming' 카테고리의 다른 글
Xcode 8 Beta 3 레거시 스위프트 사용 문제 (0) | 2020.05.08 |
---|---|
cURL 오류 60 : SSL 인증서 : 로컬 발급자 인증서를 가져올 수 없습니다 (0) | 2020.05.08 |
전체 ASP.NET 웹 사이트에 대해 브라우저 캐시를 사용하지 않도록 설정 (0) | 2020.05.08 |
Android Studio에서 갑자기 기호를 확인할 수 없습니다 (0) | 2020.05.08 |
JavaScript에서 속성별로 객체 색인을 얻는 방법은 무엇입니까? (0) | 2020.05.08 |