将数据收集到一个对象中,并在 .NET/C# 中对其进行排序

本文关键字:排序 NET 并在 数据 一个对象 | 更新日期: 2023-09-27 17:56:13

在我们的.NET/C#项目中,我们将所有用户的浏览器名称/版本,操作系统名称等保存在数据库中。稍后,我们将获取这些数据并用于统计目的。现在我需要以某种方式定义,例如:

5 位客户拥有 Windows 7 + Internet Explorer 8
4 位客户拥有 Windows XP + Internet Explorer 6等。

从数据库中获取数据时,我可以定义使用了哪个操作系统和哪个浏览器,

但情况是,当我收集数据时,我将如何获取哪个浏览器和哪个操作系统一起使用并获取此类平台的数量?例如,我会搜索Windows XP,系统会向我显示哪些浏览器与该操作系统一起使用以及数量。

有人可以给出一个提示吗?

谢谢。

将数据收集到一个对象中,并在 .NET/C# 中对其进行排序

听起来非常适合GROUP BY运算符(如果使用SQL),或者如果要保留在.NET中,则使用Linq GroupBy()方法(http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby.aspx)。

例如,在 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 };

从这里,您将拥有一组组,然后可以从中获取计数。

您需要查看分组。在 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 直接查询它。

创建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;
}