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

C# 将数据收集到一个对象中并在.NET/C中对其进行排序#,c#,.net,sorting,C#,.net,Sorting,在.NET/C#项目中,我们将所有用户的浏览器名称/版本、操作系统名称等保存在数据库中。稍后,我们获取这些数据并用于统计目的。现在我需要以某种方式定义,例如: 5名客户使用Windows 7+Internet Explorer 8 4个客户使用Windows XP+Internet Explorer 6 等等 当从数据库中获取数据时,我可以定义使用了哪些操作系统和哪些浏览器,但情况是,当我收集数据时,我如何获得一起使用的哪些浏览器和哪些操作系统,以及这些平台的数量?例如,我会搜索Windows

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


5名客户使用Windows 7+Internet Explorer 8
4个客户使用Windows XP+Internet Explorer 6 等等

当从数据库中获取数据时,我可以定义使用了哪些操作系统和哪些浏览器,但情况是,当我收集数据时,我如何获得一起使用的哪些浏览器和哪些操作系统,以及这些平台的数量?例如,我会搜索Windows XP,系统会显示哪些浏览器与该操作系统一起使用,以及使用的数量

有人能给我一个提示吗


谢谢。

听起来非常适合
GroupBy
操作符(如果您使用的是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 };

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

听起来非常适合
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 };

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

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

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

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

无法将GROUP BY用于SQL,您无权更改存储过程。不过我会看看LINQ的GrouBy()。谢谢无法将GROUP BY用于SQL,您无权更改存储过程。不过我会看看LINQ的GrouBy()。谢谢我想你的意思是“阻抗”不匹配,但“阳痿”让我咯咯笑了起来我想你的意思是“阻抗”不匹配,但“阳痿”让我咯咯笑了起来“Windows7+InternetExplorer8”和“WindowsXP+InternetExplorer6”只是例子。事实上,如果我这么做的话,会有太多的键-Windwos XP+FireFox+Java 1.6+.NET3.5等+Flash 10等@cycero:但是,为什么会有问题呢?Daniel的解决方案可以处理任意数量的组合。根据需要清晰或广泛地生成密钥。这取决于你。或者,重写你的问题——因为也许你需要完全不同的结果集……“Windows 7+Internet Explorer 8”和“Windows XP+Internet Explorer 6”只是例子。事实上,如果我这么做的话,会有太多的键-Windwos XP+FireFox+Java 1.6+.NET3.5等+Flash 10等@cycero:但是,为什么会有问题呢?Daniel的解决方案可以处理任意数量的组合。根据需要清晰或广泛地生成密钥。这取决于你。或者,重写你的问题-因为也许你需要完全不同的结果集。。。