2010-07-20 3 views
3

내가 문자열의 2 차원 배열로 Parallel.ForEach를 호출하는 방법을 알아내는 약간의 문제가있어 함께 Parallel.ForEach를 호출하는 방법 : I 명시 적으로 유형을 지정하지 않으면다차원 배열

string[,] board = new string[,]{ 
     {"A", "B", "C", "D", "E" }, 
     {"F", "G", "H", "I", "J"}, 
     {"K", "L", "M", "N", "O"}, 
     {"0", "1", "2", "3", "4"}}; 

Parallel.ForEach(board, row => 
    { 
     for (int i = 0; i < row.Length; ++i) 
     { 
      // find all valid sequences 
     } 
    }); 

다음 오류가 발생합니다.

The type arguments for method 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

형식 인수를 명시 적으로 지정하는 올바른 방법은 무엇입니까?

답변

6

문제는 2 차원 배열이 IEnumerable<one-dimensional-array>을 구현하지 않는다는 것입니다. (그것은 IEnumerable을 구현 않지만, 배열을 "평평하게"라는 문자열의 IEnumerable입니다.) 당신은 두 가지를 수행 할 수 있습니다, 가변 배열 - 중 - 배열에 string[][]

  • 변경 string[,]을.

  • 2 차원 배열을 반복하여 IEnumerable<one-dimensional-array>으로 바꾸는 확장 메서드를 구현하십시오.

+0

아 ... * 표시 들쭉날쭉 * 배열했다! – Kiril

+0

@Link : 또한 성능이 충분히 평행을 이루기에 충분하다면 색인을 생성하는 것이 더 효율적이므로 가변 배열을 사용하고 싶을 것입니다. –

+0

@Brian Gideon : 나는 그 말을하는 것이 이상하다고 생각합니다. 적절한 경우 (예 : 장기 실행, 독립적 인 운영의 경우) 병렬화는 성능을 * 실질적으로 변경할 수 있습니다. 성능상의 이유로 다차원 배열을 지그재그 배열로 변환하는 것이 내가 마이크로 최적화라고 부르는 것입니다. –

3

당신은 여전히 ​​Parallel.ForEach 대신 Parallel.For를 사용하여 다차원 배열이 일을 할 수 있어야한다 :

string[,] board = new string[,] { 
    {"A", "B", "C", "D", "E" }, 
    {"F", "G", "H", "I", "J"}, 
    {"K", "L", "M", "N", "O"}, 
    {"0", "1", "2", "3", "4"} 
}; 

int height = board.GetLength(0); 
int width = board.GetLength(1); 

Parallel.For(0, height, y => 
    { 
     for (int x = 0; x < width; ++x) 
     { 
      string value = board[y, x]; 
      // do whatever you need to do here 
     } 
    } 
); 
+0

그거 좋은 생각이야! 감사! – Kiril