2012-09-13 3 views
2

다음과 같은 설정이 있다고 가정합니다 (데이터의 길이와 일반적인 정교함을 가정). 그 다음 아주 예쁘게 원하는 경우2 개의`List` 객체를 추상적 인 데이터 유형 중 하나로 합치기

List<String> 
    a = GetStrings(0), 
    b = GetStrings(1); 
for(int i = 0; i < a.Count; i++) 
    yield return new SuperString{ A = a[i], B = b[i] }; 

는 내가 궁금해하는 것은 이것이 foreach 루프로 리팩토링 할 수있는 경우입니다. 나는이 작업을 에서 수행 할 것이기 때문에 for 전에 사용하는 것이 더 낫습니다. 각 요소 쌍의입니다.

편집 :

자세한 내용은 부족했을 수 있습니다. 미안합니다. 유형이 임의라면 어떻게 될까요? 나는. 다음과 같이?

IEnumerable<Cool> a = GetCool(); 
IEnumerable<Lame> b = GetLame(); 

for(int i = 0; i < a.Count; i++) 
    yield return new Opposites{ A = a[i], B = b[i] }; 
+3

사용 우편 방법 : –

+0

OK ... 나의 첫번째 생각 : "이 잭 - 당나귀에 보고서 깃발을 명중"... 그럼 나는 ** ** 실제로'** Zip' 메서드를 점검하고 ** 거기에 대해 들어 본 적이 없다! –

+1

@Chamster : 기술적으로 잘못된 주석에 대해서는 주석 플래그를 사용하지 않아야합니다. –

답변

10

전혀 루프가 없습니까?

a.Zip(b, (aa, bb) => new SuperString{A = aa, B = bb}) 

Zip 방법의 장점은 그들이 서로 다른 길이의있는 경우에 두 시퀀스의 짧은의 끝에서 중지 것입니다.

참고 : .net < 4를 사용하는 경우 @ Cuong의 방법을 사용하고 싶을 것입니다.

당신의 유형은 임의있는 경우

, 정확히 같은 작업을해야합니다 :

IEnumerable<Cool> a = GetCool(); 
IEnumerable<Lame> b = GetLame(); 
a.Zip(b, (aa, bb) => new Opposites{A = aa, B = bb}); 

Opposites의 재산 A 유형 Cool 입력 LameB이어야한다는주의 (또는 부모 타입)과

+2

목록의 이름이 같기 때문에 (a, b)를 (x, y)로 변경해야합니다. –

+0

잘 잡습니다. 감사. – spender

+0

아, 나는 그것이 작동하지 않기 때문에 싸우고 징징 거리고있었습니다. VS는 범위 내에서 갈등을 느꼈지만 새로운 (너무 멋진'Zip') 딱지에 너무 붙어있었습니다. –

3

사용 Zip method:)

var result = Enumerable.Zip(
    GetStrings(0), 
    GetStrings(1), 
    (x,y) => new SuperString{ x,y} 
); 

알 따라서 문서의이 부분을 놓치지 마십시오.

시퀀스의 요소 수가 같지 않으면이 메서드는 시퀀스 중 하나의 끝에 도달 할 때까지 시퀀스를 병합합니다. 예를 들어 한 시퀀스에 세 개의 요소가 있고 다른 시퀀스에 네 개의 요소가있는 경우 결과 시퀀스에는 세 개의 요소 만 있습니다.

5

Zip 옆에, 당신은 사용할 수 Enumerable.Range :

Enumerable.Range(0, a.Count) 
      .Select(i => new SuperString{ A = a[i], B = b[i] }); 
+0

+1 for .net 3.5 compatibility – spender

+0

@spender : +1 언급 : :) –

+0

@spender 3.5에서 자신의'Zip' 메소드를 정의하는 것이 상당히 간단하다는 것에주의하십시오. – Servy

관련 문제