2010-08-13 3 views
11

숫자 목록이 있으며, 목록에있는 모든 고유 한 조합을 반복없이 LINQ 쿼리를 사용하여 만들어야합니다. 예를 들어 { 1, 2, 3 }이있는 경우 조합은 1-2, 1-32-3이됩니다.LINQ를 사용하여 반복 목록이없는 단일 목록의 모든 고유 한 조합을 선택하십시오.

나는 현재과 같이, 두 for 루프를 사용

for (int i = 0; i < slotIds.Count; i++) 
{ 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     ExpressionInfo info1 = _expressions[i]; 
     ExpressionInfo info2 = _expressions[j]; 

     // etc... 
    } 
} 

는 LINQ이 두 for 루프를 변환 할 수 있습니까?

감사합니다.

답변

28

물론 - 당신이 Skip에 포함 된 호출 SelectMany 단일 호출을 수행 할 수 있습니다

var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1), 
           (first, second) => new { first, second }); 

여기 아주SelectMany의 이러한 비의 오버로드를 사용하지 않는 다른 옵션이다 :

var query = from pair in slotIds.Select((value, index) => new { value, index }) 
      from second in slotIds.Skip(pair.index + 1) 
      select new { first = pair.value, second }; 

이들은 기본적으로 약간 다른 방식으로 동일합니다.

var query = from index in Enumerable.Range(0, slotIds.Count) 
      let first = slotIds[index] // Or use ElementAt 
      from second in slotIds.Skip(index + 1) 
      select new { first, second }; 
+0

는 비의 최초의 솔루션에 대한 설명은이를 참조하십시오 : http://stackoverflow.com/questions/7991486/select-all-unique- 여기

은 원래 훨씬 더 가까이있는 다른 옵션들 하나의리스트와 함께 반복되지 않는 반복을 사용하는 linq-pa – Thilo

+1

@David : .NET의 컬렉션 중 어떤 요소도 여러 번 반복 할 때 다른 순서로 요소를 반환하지 않는다고 생각하지 않습니다. 사이에 변경됩니다. 일관성있는 한 우리는 그 명령이 무엇인지 상관하지 않습니다. –

+0

Dangit, 어딘가에 이상한 버그가 있습니다. 덕분에 제 2 댓글을 삭제할 것입니다 : p – David

관련 문제