2014-11-26 4 views
-2

Я пытаюсь создать график гистограммы значений времени жизни в C#.Группировка данных по диапазону для создания гистограммы

Я хотел бы сгруппировать данные в 10 копеек. Я пытаюсь найти способ, которым я не должен явно определять каждый ведро.

выход будет что-то вроде этого:

Range : Count 
0-10 : 23 
10-20 : 40 
20-30 : 43 

ЭСТ ...

У меня также есть таблица членов; скажем, у него есть два поля.

int Id 
Decimal LifeTimeValue 

Есть ли способ сделать это в LINQ, который не требует от меня явного определения каждого ведра?

Вот что я сделал до сих пор в SQL. Я могу легко переносить это в LINQ, но это плохой подход, поскольку мне придется дублировать предложение when для каждого ведра.

select 
case when LifeTimeValue >= 0 and LifeTimeValue < 10 then ' 0 - 10' 
      when LifeTimeValue > 10 and LifeTimeValue <= 20 then ' 10+ - 20' 
      when LifeTimeValue > 20 and LifeTimeValue <= 30 then ' 20+ - 30' 
      else 'over 30' 
end As PriceRange, 
count(LifeTimeValue) as ItemTotal 
from tblMember 
group by 
case when LifeTimeValue >= 0 and LifeTimeValue < 10 then ' 0 - 10' 
      when LifeTimeValue > 10 and LifeTimeValue <= 20 then ' 10+ - 20' 
      when LifeTimeValue > 20 and LifeTimeValue <= 30 then ' 20+ - 30' 
      else 'over 30' 
end; 
+2

http://sscce.org/. 'Я ищу запрос linq, который создавал бы это для меня.' Не вопрос. –

+0

Где твоя неудачная попытка? –

+0

Это очень ленивая попытка ответить на этот вопрос. Где ваша попытка решить эту проблему? В любом месте даже нет знака вопроса. –

ответ

3

Ключ часть: x.LifeTimeValue - (x.LifeTimeValue % 10)

var query = from x in context.Member 
      group x by x.LifeTimeValue - (x.LifeTimeValue % 10) into x 
      select new 
      { 
       Range = x.Key, 
       Count = x.Count() 
      } 
4

Это важно при создании гистограммы, что вы покрываете случай, когда ковш не может иметь никаких данных. Важным является результат 0 для ведра.

Также, вероятно, целесообразно предоставить данные в виде ведра.

Сначала сделайте поиск:

var lookup = context.Member.ToLookup(x => (int)x.LifeTimeValue/10); 

Переход к int позволяет целочисленное деление, чтобы сделать ведро.

Теперь нам нужно найти степень данных:

var smallest = lookup.Min(x => x.Key); 
var largest = lookup.Max(x => x.Key); 

Теперь запрос легко:

var query = 
    from x in Enumerable 
     .Range(smallest, largest - smallest + 1) 
    select new 
    { 
     Range = String.Format("{0}-{1}", x * 10, (x + 1) * 10), 
     Count = lookup[x].Count(), 
    }; 

Вот мой результат с некоторой выборки данных я создал:

histogram data

Обратите внимание, что в диапазоне 10-20 имеется 0 для счета.