2012-10-05 3 views
0

두 개의 배열 정의가 있는데 루프 연산없이 요소별로 더하기 연산을하고 싶습니다. 예를 들어 :C#의 덧셈 연산을 통해 배열에 어떻게 가입합니까?

decimal[] xx = { 1, 2, 3 }; 
decimal[] yy = { 6, 7, 8 }; 

내가 원하는 결과는 다음과 같습니다

decimal[] zz = { 7, 9, 11 }; 

추가 작업이 간단합니다.

decimal[] zz = decimal[xx.Length]; 
for (int i=0; i<xx.Length;i++){ 
    zz[i] =xx[i] + yy[i]; 
} 

과 같이 각 요소에 하나씩 추가하십시오. 그러나 루핑 작업을 사용하고 싶지는 않습니다.

decimal[] zz = xx.Zip(yy, (x, y) => x + y).ToArray(); 
+3

왜 루프를 제거 하시겠습니까? – Rob

+1

왜 루프 당 3 번 추가 하시겠습니까 ??? –

답변

2

당신은 할 수없는 그 어떤 방법 또는 기타를 반복하지 않고.

배열 생성 및 루프는해야한다 :

decimal[] zz = new decimal[xx.Length]; 
for (int i = 0; i < xx.Length; i++){ 
    zz[i] = xx[i] + yy[i]; 
} 

또는 더 컴팩트하지만 다소 덜 읽을 버전 :

decimal[] zz = new decimal[xx.Length]; 
for (int i = 0; i < xx.Length; zz[i++] = xx[i] + yy[i]); 
또한 루프 할 Linq에 확장을 사용할 수 있습니다

:

decimal[] zz = xx.Select((x, i) => x + yy[i]).ToArray(); 

또는

decimal[] zz = Enumerable.Range(0, xx.Length).Select(i => xx[i]+yy[i]).ToArray(); 
9

당신은 Enumerable.Zip를 사용할 수 있습니다. 그들은 전 세계적으로 배열 범위 경우

+1

이 .net3.5에서 작동하지 않습니다. – Habibillah

+1

... .net을 3.5로 대체하는 것은 간단합니다. http://www.blackwasp.co.uk/LinqZip35.aspx – spender

2

당신은 LINQ를 사용할 수 있습니다 :

var zz = Enumerable 
      .Range(0, (int)Math.Min(xx.Length, yy.Length)) 
      .Select(i => xx[i] + yy[i]) 
      .ToArray(); 

을하지만 정말 그냥 루핑 배후를 움직이는

+0

이것이 가장 좋은 방법입니다. Enumerable.Zip'은 .NET 4.0을 필요로하기 때문에. –

+0

'xx'가'yy'보다 큰 경우'IndexOutOfRangeException'이됩니다. –

+0

건배 Tim, 고정. – Rawling

0

당신은

public void add(int index){ 

    zz[index] = xx[index] + yy[index]; 

    if(index < xx.Length){ 
    add(index+1); 

    } 

} 

이 사이비 코드, 테스트되지 않은,하지만 일반적인 생각을 나타내는 재귀 사용할 수 있습니다. 네 생각을 말해봐.

+0

이것이 루프를 사용하지 않는 유일한 대답이기 때문에 -1이라고 생각하지는 않습니다. – Rawling

+0

감사합니다! 나는 그것의 최적성에 관해서는 아무런 보장도하지 않지만, 그것이 간단한 것을 만족하기를 희망합니다! – ComethTheNerd

3
var zz = xx.Select((x, i) => x + yy[i]).ToArray(); 
+0

+1, 영리한 방법으로'Select' 사용 –

+0

'xx'가'yy'보다 큰 경우'IndexOutOfRangeException'이됩니다. –

+1

@TimSchmelter 그리고'Zip'은 그것을 무시할 것입니다. 더 낫니? –

2

Enumerable.RangeZip 옆를 사용하는 또 다른 방법은 :

var result = Enumerable.Range(0, xx.Length) 
         .Select(i => xx[i] + yy[i]) 
         .ToArray(); 
+0

[두 번째 인수는 개수가 아니고 최대 값입니다] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx). – Rawling

+0

@Rawling : 미안 포인트를 얻지 못했습니다 –

+0

이 코드는'xx'보다 하나 적은 원소를 가진 배열을 반환합니다. – Rawling

관련 문제