2017-12-13 20 views
2

더 나은 용어가 부족합니다. 나는 string[]을 가지고 있고 나중에 사전에 넣으려고 catesian 제품을 자체적으로 조제하고 싶습니다. 그러나 복제/중복 키가있을 때을 제외한 모든 가능한 조합을 싶습니다.문자열 []의 데카르트 곱 (C) 직접 복제/복제하지 않고 #

aa aa 
aa bb 
aa cc 
bb aa 
bb bb 
bb cc 
cc aa 
cc bb 
cc cc 

은 내가 여기에 이해하려고 노력하고있어이 같은 결과를 가질 때 호출에 합류 것입니다 :

string[] array1 = { "aa", "bb", "cc" }; 
string[][] arrayOfArrays = array1.SelectMany(left => array1, (left, right) => new string[] { left, right }).ToArray(); 

각 요소로 산출 가능한 모든 조합에서 string[][]을 얻을 것이다

aa bb 
aa cc 
bb aa 
bb cc 
cc aa 
cc bb 

그런 식으로 사전을 만들 때 for 루프를 사용하지 않고 해당 값 쌍으로 키를 가져올 필요가 없습니다. 1-liner 나 lambda에서 이것을 시연했다면, 이런 종류의 문법에 대해 더 많이 이해하려고 노력하면서 그것을보고 싶습니다.

답변

5

이름이 확실하지 않지만 Where 절을 사용하여 일치하는 값을 필터링 할 수 있습니다.

string[][] arrayOfArrays = 
    array1.SelectMany(left => array1, (left, right) => new string[] { left, right }) 
      .Where(x => x[0] != x[1]) 
      .ToArray(); 
+0

이것은 내가 찾고있는 것입니다. 이름이 지금 무엇인지 궁금하지만. 이 작동을 다른 언어로 다시 봐야 할 경우에 대비해. – Jamin

+0

이름이있을 수 있습니다. 그렇지 않을 수도 있습니다. 데카르트 제품은 쉽게 정의 할 수 있지만 일부 값이 제거 된 데카르트 제품에 주어진 이름을 결코 들어 본 적이 없습니다 (이 경우 양쪽에서 값이 일치 할 때). –

+0

고마워요. 매우 유용합니다. – Jamin