2010-04-28 5 views
3

Linq를 사용하여 항목이 둘 이상의 그룹에 속하는 그룹을 만들 수 있습니까?Linq - 항목이 여러 그룹에 속하는 그룹화?

public class Data 
    { 
     public string ID; 
     public int From; 
     public int To; 
    } 

그리고이 목록 :

List<Data> data = new List<Data>() 
    { 
     new Data() { ID = "A", From = 1, To = 3 }, // Call this A 
     new Data() { ID = "B", From = 1, To = 2 }, // Call this B 
     new Data() { ID = "C", From = 2, To = 3 } // Call this C 
    }; 

내가 원하는에서와 (할 수있는 범위에서 가능한 각 정수에 의해 그룹하지만 대신 찾는 다음과 같은 사소한 예를 사용

min + max 내가 원하는 범위 (예 : 1에서 3)로 쿼리를 제공 할 수 있으며 각 그룹에서 그룹화 int가 해당 범위에 맞는 데이터 인스턴스에 대한 참조가됩니다.

하드 나는 각각의 기대 각 그룹 및 인스턴스 보여주기 위해 쉽게 설명하기 :이게 가능

[Group 1] 1 - A, B 
[Group 2] 2 - A, B, C 
[Group 3] 3 - A, C 

를? 또는 그룹이 상호 배타적이어야합니까?

편집 : 가입 방법?

먼저 범위를 공개하지 않고도이 작업을 수행 할 수 있습니까?

는 는 # 2 편집

:는 대답이 리팩토링을 사용하여, 당신이 할 수는 :

var result = Enumerable.Range(1,3) 
         .Select(i => new 
            { 
             Key = i, 
             Values = data.Where(d => i >= d.From && 
                  i <= d.To) 
             }); 

이 무엇을 맞는 모든 데이터 인스턴스가없는 범위도 돌아 숫자의 추가 혜택입니다시킨 I 필요한 것.

답변

2

GroupBy 대신 Join을 사용해보십시오. 그룹화는 상호 배타적이라고 생각합니다. 당신이 From <= Value AND To >= Value

편집 데이터의 목록에 값을 "그룹화"소망하는 가입 이 같이 당신의 범위를 얻을 수 있습니다 (귀하의 코멘트에 대한 답변에서) : 같은

int min = data.Min(a => a.From); 
int max = data.Max(a => a.To); 
List<int> range = new List<int>(); 
for (int i = min; i <= max; i++) 
    range.Add(i); 
+0

나는 당신이 옳을 수도 있다고 생각하고, 내가 시도한 것을 보여주기 위해 나의 질문을 편집했다. 처음에 범위를 만들 필요가 없다면 좋을까요? – Kasaku

1

GroupBy 그룹 항목을 두 개 이상의 그룹에 항목이 없습니다.

이것은 당신이 원하는 일을해야합니다

var result = data.SelectMany(d => Enumerable.Range(d.From, d.To - d.From + 1)) 
       .Distinct() 
       .Select(i => new 
           { 
            Key = i, 
            Values = data.Where(d => i >= d.From && 
                  i <= d.To) 
           }); 

이 당신이 이미 가지고있는 솔루션에 비해 큰 개선의 경우 나도 몰라는하지만.

+0

건배, 그게 실제로 유용합니다, 나는 그것을 약간 리팩터링했고 그것을 제 질문에 추가했습니다. 나는 심지어 어떤 데이터 항목이 없더라도 범위의 숫자가 반환되도록하는 상황을 얻으려고했는데, 이것이 나에게있어. – Kasaku