2012-12-12 3 views
0
var data = new[] { 
new { Id = 0, Cat = 1, Price = 2 }, 
new { Id = 1, Cat = 1, Price = 10 }, 
new { Id = 2, Cat = 1, Price = 30 }, 
new { Id = 3, Cat = 2, Price = 50 }, 
new { Id = 4, Cat = 2, Price = 120 }, 
new { Id = 5, Cat = 2, Price = 200 }, 
new { Id = 6, Cat = 2, Price = 1024 }, 
}; 

var ranges = new[] { 10, 50, 100, 500 }; 

필요한 출력은 범주에 따라 사용 된 범위보다 크거나 같은 그룹화 된 가격입니다. (한 LINQ 문)linq (범위 + 개수)를 사용하여 그룹

cat range  count 
------------------------------------- 
1  10   2 (In 1. categories there is 2 item that price >= 10(range) [10;30]) 
2  10   4 (In 2. categories there is 4 item that price >= 10(range) [50;120;200;1024]) 
2  50   4 .... 
2  100   3 .... 
2  500   1 (In 2. categories there is 1 item that price >= 500(range) [1024]) 
+4

당신이 무엇이든을 시도 되세요 너 자신? 그렇다면 해당 코드를 추가하십시오. – Destrictor

+0

"모든 범주에 따라 사용되는 범위와 같거나 더 강합니다"라는 의미는 * 모두 * 분명하지 않습니다. –

+1

출력이 의미가 없습니다. 개수 열의 합계가 예제의 항목 수보다 큽니다. 당신이 원하는 것을 정확히 상세히 설명 할 수 있습니까? – juharr

답변

4

이 시도 :

var data = new[] { 
new { Id = 0, Cat = 1, Price = 2 }, 
new { Id = 1, Cat = 1, Price = 10 }, 
new { Id = 2, Cat = 1, Price = 30 }, 
new { Id = 3, Cat = 2, Price = 50 }, 
new { Id = 4, Cat = 2, Price = 120 }, 
new { Id = 5, Cat = 2, Price = 200 }, 
new { Id = 6, Cat = 2, Price = 1024 }, 
}; 

var ranges = new[] { 10, 50, 100, 500 }; 

var result = from r in ranges 
     from g in data 
     where g.Price >= r 
     select new {g.Cat, Price=r}; 

var groupedData = 
     from d in result 
     group d by new{d.Cat, d.Price} into g 
     select new{Cat=g.Key.Cat, Price=g.Key.Price, TotalCount=g.Count()}; 
+0

하나의 linq 문이 아니야 – thumbmunkeys

+2

@pivotnig 아니요.하지만 쉽게 만들 수 있습니다. – Rawling

4

이 작동합니다 :

var values = 
data.SelectMany(x => ranges.Where(y => x.Price >= y) 
          .Select(y => new { Record = x, Range = y })) 
    .GroupBy(x => new { Cat = x.Record.Cat, Range = x.Range }) 
    .Select(x => new { Cat = x.Key.Cat, Range = x.Key.Range, Count = x.Count()}); 

결과 :

{ Cat = 1, Range = 10, Count = 2 } 
{ Cat = 2, Range = 10, Count = 4 } 
{ Cat = 2, Range = 50, Count = 4 } 
{ Cat = 2, Range = 100, Count = 3 } 
{ Cat = 2, Range = 500, Count = 1 }