Сбор данных в один объект и их сортировка в .NET / C#

#c# #.net #sorting

#c# #.net #сортировка

Вопрос:

В нашем проекте .NET / C # мы сохраняем имя / версию браузера всех пользователей, название операционной системы и т.д. В базе данных. Позже мы берем эти данные и используем для статистических целей. Теперь мне нужно как-то определить, например:

У 5 клиентов была Windows 7 Internet Explorer 8
У 4 клиентов была Windows XP Internet Explorer 6 и т.д.

При получении данных из базы данных я могу определить, какая ОС и какой браузер использовались, но дело в том, что когда я собираю данные, как я получу, какой браузер и какая ОС использовались вместе, и получу количество таких платформ? Например, я бы искал Windows XP, и система показала бы мне, какие браузеры использовались с этой ОС и в каком количестве.

Кто-нибудь может дать подсказку?

Спасибо.

Ответ №1:

Звучит как идеально подходящий для GROUP BY оператора (если вы используете SQL) или метода Linq GroupBy() (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby.aspx ) если вы хотите остаться в .NET.

Например, в SQL:

 SELECT COUNT(*), OS, BROWSER
FROM YOURTABLE
GROUP BY OS, BROWSER
  

Или в Linq:

 var groups = from yt in yourtable
             group yt by new { yt.OS, yt.BROWSER } into ytgroup
             select new { key = ytgroup.key, groups = ytgroup };
  

Отсюда у вас будет набор групп, из которых вы затем сможете получить подсчеты.

Комментарии:

1. Не могу использовать GROUP BY для SQL, не имею права изменять хранимую процедуру. Однако взглянем на GrouBy() от LINQ. Спасибо!

Ответ №2:

Вам нужно взглянуть на группировку. В linq это может выглядеть примерно так:

 var info = from record in records where record.OperatingSystem == "WinXp"
    group record by record.Browser into g
    select new { Browser = g.Key, Records = g };
  

Если вы используете что-то вроде ravendb, у вас будет очень хороший способ сделать это без сложного несоответствия импедансов, которое по своей сути обеспечивает SQL RDBMS. Это означает, что вы можете запросить его напрямую с помощью этого linq.

hth

Комментарии:

1. Я думаю, вы имеете в виду несоответствие «импеданса», но «импотенция» заставила меня усмехнуться. 😉

Ответ №3:

Создать Dictionary<string, int> d;

Пусть вашим ключом будут строки, такие как «Windows 7 Internet Explorer 8» или «Windows XP Internet Explorer 6». Вероятно, у вас будет готова процедура генерации ключей.

Сделайте это:

 foreach (CollectedDataItem item in CollectedData)
{
    string key=generateKeyFromItem(item);
    if (!d.HasKey(key)) {
         d.Add(key, 1);
    }
    else {
         d[key]  ;
    }
}
  

И, наконец,,

 string generateKeyFromItem(CollectedDataItem Item)
{
    return Item.OS " " Item.Browser;
}
  

Комментарии:

1. «Windows 7 Internet Explorer 8» и «Windows XP Internet Explorer 6» были просто примерами. На самом деле, если бы я это сделал, было бы слишком много ключей — Windwos XP FireFox Java 1.6 .NET3.5 и т.д. Flash 10 и т.д.

2. @cycero: Но почему это проблема? Решение Дэниела может обрабатывать любое произвольное количество комбинаций.

3. сгенерируйте ключи настолько четко или широко, насколько вам нужно. это зависит от вас. или перепишите свой вопрос — потому что, возможно, вам нужен совершенно другой набор результатов…