람다 식을 사용하여 객체 목록을 한 유형에서 다른 유형으로 변환 결과를 얻을 수 있다고

한 유형의 객체 목록을 읽고 다른 유형의 객체 목록을 생성하는 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 }));