2012-02-01 3 views
5

가능한 중복 :
Generating all Possible CombinationsLINQ 문에서 N 열거 형?

잘 모르겠어요 어떻게 표현 질문에; 하지만 LINQ 문을 사용하여 해결할 수있는 어리석은 논리 퍼즐 작업을하고있었습니다. 관련 코드는 다음과 같이 보았다 :

(from myA in Enumerable.Range(1, 40) 
from myB in Enumerable.Range(1, 40) 
from myC in Enumerable.Range(1, 40) 
from myD in Enumerable.Range(1, 40) 
where myA + myB + myC + myD == 40 
    && myA <= myB 
    && myB <= myC 
    && myC <= myD 
select new[] {myA, myB, myC, myD}) 

그래서 그것은 기본적 WHERE 절에 조건을 충족 A, B, C의 D의 모든 조합을 생성합니다.

내가 지금하려는 것은 일반화 된 것이므로 단지 4 개가 아닌 N 개의 값으로 똑같은 작업을 수행 할 수 있습니다. 예를 들어, 3 개 값 - 해당하는 코드는 다음과 같습니다 당연히

(from myA in Enumerable.Range(1, 40) 
from myB in Enumerable.Range(1, 40) 
from myC in Enumerable.Range(1, 40) 
where myA + myB + myC == 40 
    && myA <= myB 
    && myB <= myC 
select new[] {myA, myB, myC}) 

, 나는 코드를 수정하고 싶지 않아 - 내가 전화 정수를 제공하고 올바른을 반환 한 할 수있는 기능을 원하는 목적.

몇 가지 잘못된 시도를했습니다. 그러나 나는 그런 것을하는 법을 정말로 볼 수 없다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

+4

에릭 Lippert의이 http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian- ([이에 블로그] product-with-linq.aspx)를 사용하면 많은 시퀀스의 제품을 계산할 수 있습니다. 도움이 될 수도 있습니다. –

+0

@AnthonyPegram - 완벽합니다. 정확히 내가 뭘 찾고 있어요. 답변을 게시하고 싶다면 동의하겠습니다. –

+0

* 내 대답이 아닙니다. ;) 크레딧을 지불해야하는 곳에 크레딧을주고 싶다면 [try here] (http://stackoverflow.com/a/3098381/414076) –

답변

0

링크를 읽지 않고 올바른 접근 방법인지 확신 할 수 없지만 모든 노드가 40 개 (또는 예제에서는 20 개) 인 깊이 n의 트리를 걷고 있다고 상상하지는 마십시오. 어린이? 그런 다음, 다음과 같이 표시됩니다

class Program { 
    static void Main(string[] args) { 
     Walk(3).Where(l => l.Sum() == 20 && 
      l.Skip(1).Where((num, i) => num < l[i]).Count() == 0) 
     .ToList().ForEach(l => Console.WriteLine(string.Join(" ", l))); 
     Console.ReadLine(); 
    } 

    static IEnumerable<List<int>> Walk(int depth) { 
     return depth == 0 ? 
      new[] { new List<int>()} : 
      Enumerable.Range(1,20).SelectMany(i => 
       Walk(depth - 1).Select(l => l.Concat(new[] {i}).ToList())); 
    } 
}