2009-06-13 1 views
9

다른 유형으로 변환하려는 한 유형의 개체 모음이 있습니다. 이 작업은 foreach를 사용하여 쉽게 수행 할 수 있지만 Linq의 집계 함수를 사용하여이를 수행하는 방법을 알고 싶습니다.Linq의 집계 함수를 사용하여 목록에 추가하는 방법 C#

문제는 모두 '+'연산자를 지원하는 모든 집계 예제 사용 유형 줄 문자열 또는 int입니다. accumulator 타입을 '+'의미론을 지원하지 않는리스트로 만들고 싶습니다.

public class DestinationType 
{ 
    public DestinationType(int A, int B, int C) { ... } 
} 

var set = from item in context.Items 
      select new { item.A, item.B, item.C }; 

var newSet = set.Aggregate(new List<DestinationType>(), 
          (list, item) => list.Add(new DestinationType(item.A, item.B, item.C))); 

문제는 그 목록 <입니다> .Add 무효 반환

여기에 빠른 예입니다. Aggregate에 대한 두 번째 매개 변수의 반환 유형은 List 여야합니다.

내가 '+'타입 의미 지원 목록 유형이 있다면 난 그냥 이런 종류의 일을 지원하는 모든 콜렉션 유형을 찾을 수 없습니다 그러나 두 번째 매개 변수

list + item 

을 만들 수 있습니다.

Linq에서 이처럼 쉽게 사용할 수 있습니다. 방법이 있습니까? 또한, 내가 더 쉬운 방법을 놓치고 있다면, 나는 그것에 대해서도 배우고 싶다. 감사!

+0

모든 좋은 답변 주셔서 감사합니다! Sam & Talljoe의 대답은 Linq를 사용하여 가장 간단하게 수행되었습니다. 다시 Thx! – Slaggg

답변

9

ToList()과 결합 된 Select의 전화가 여기에 필요할 수 있습니다. 예를 들어 :

context.Items 
    .Select(item => new DestinationType(item.A, item.B, item.C)) 
    .ToList(); 
23

이 객체에 LINQ입니다 가정,

var newSet = set.Aggregate(new List<DestinationType>(), 
            (list, item) => 
            { 
             list.Add(new DestinationType(item.A, item.B, item.C)); 
             return list; 
            }); 
+0

이것이 올바른 방법입니다. – mquander

+0

Func 부분에서 Union을 사용할 때도 유용합니다. –

4

당신은 여기 select을 적용 할 수 있습니다 ... 시도합니다.

var newSet = set.Select(item => new DestinationType(...)).ToList(); 

Aggregate (일반적 fold 또는 reduce라고도 함)

select는 각 요소에 함수를 적용 함께 요소를 결합하는데 사용된다.

예는 :

하자가 [a, b, c].select(f)[f(a), f(b), f(c)]에 해당 다음 단항 함수, 수 f.

을 이진 함수로 놓은 다음 [a, b, c].aggregate(f, init)f(a, f(b, f(c, init)))이되도록하십시오. 당신이 정말로 원하는 경우

reversed = fold (\list element -> element:list) [] [1..10] 

:

당신이 당신의 예에서 선택한 방법은 C#에서 드문하지만 종종 (연결) 목록이 새 목록으로 변환하는 대신 기존 수집을 변경하는 함수형 프로그래밍에서 사용되는 이 계산을 aggregate으로 수행하고 Dustin의 솔루션을 사용하거나 불변의 콜렉션에 대해 링크 목록 기반 유형을 더 잘 구현하십시오.이 유형을 operator +으로 지정할 수도 있습니다.

3
list.AddRange(context.Items.Select(item => 
    new DestinationType(item.A, item.B, item.C)); 

나는 그것이 집계 함수를 사용하지 않습니다 실현,하지만 당신은 아마도 집계를 배우고 사용하는 것이 더 좋은 예를 찾아 내야한다.

1

내가 뭔가를 분명 누락하지 않는 한, 단지하지 않을 이유 :

public class DestinationType 
{ 
    public DestinationType(int A, int B, int C) { ... } 
} 

var newSet = from item in context.Items 
    select new DestinationType(item.A, item.B, item.C);