#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. сгенерируйте ключи настолько четко или широко, насколько вам нужно. это зависит от вас. или перепишите свой вопрос — потому что, возможно, вам нужен совершенно другой набор результатов…