ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LINQ GroupBy在具有多个级别的对象上

2019-11-23 01:05:10  阅读:280  来源: 互联网

标签:linq c group-by


我有一些这样声明的类:

public class UserSpend
{
    public string UserName{ get; set; }
    public MonthSpend[] Spend { get; set; }

}

public class MonthSpend
{
    public DateTime Month { get; set; }
    public SpendDetail[] Detail { get; set; }

}

public class SpendDetail
{
    public string Description { get; set; }
    public decimal Amount { get; set; }
}

如您所见,它具有多个级别.我已经声明了这样的变量:

UserSpend[] allSpend;

我填充了它,所以我有几个UserSpend,每个都有若干MonthSpend,每个都有多个SpendDetail.因此数据看起来像这样:

allSpend =
UserSpend (UserName = "Bob", Spend = [
        MonthSpend (Month = "01/09/12", Detail = [
            SpendDetail (Description = "Local", Amount = "12.00"),
            SpendDetail (Description = "National", Amount = "7.00") ]
        MonthSpend (Month = "01/10/12", Detail = [
            SpendDetail (Description = "Local", Amount = "8.00"),
            SpendDetail (Description = "Mobile", Amount = "3.00"),
            SpendDetail (Description = "National", Amount = "15.00") ]
        MonthSpend (Month = "01/11/12", Detail = [
            SpendDetail (Description = "Local", Amount = "16.00"),
            SpendDetail (Description = "National", Amount = "5.00") ] ]
UserSpend (UserName = "Jack", Spend = [
        MonthSpend (Month = "01/09/12", Detail = [
            SpendDetail (Description = "Local", Amount = "1.00"),
            SpendDetail (Description = "National", Amount = "4.00"),
            SpendDetail (Description = "International", Amount = "17.00") ]
        MonthSpend (Month = "01/10/12", Detail = [
            SpendDetail (Description = "Local", Amount = "2.00"),
            SpendDetail (Description = "Mobile", Amount = "7.00"),
            SpendDetail (Description = "International", Amount = "5.00") ]
        MonthSpend (Month = "01/11/12", Detail = [
            SpendDetail (Description = "Local", Amount = "6.00"),
            SpendDetail (Description = "National", Amount = "2.00") ] ]

我想做的是填充此变量:

public class UserDataPoint
{
    public string User { get; set; }
    public string Category { get; set; }
    public int Spend { get; set; }
}

UserDataPoint[] userData;

因此userData包含以下内容:

userData = UserDataPoint (
[User = "Bob", Category = "Local", Spend = 36.00]
[User = "Bob", Category = "Mobile", Spend = 3.00]
[User = "Bob", Category = "National", Spend = 27.00]
[User = "Jack", Category = "Local", Spend = 9.00]
[User = "Jack", Category = "Mobile", Spend = 6.00]
[User = "Jack", Category = "National", Spend = 7.00]
[User = "Jack", Category = "International", Spend = 22.00]

因此,对于每个用户名,我想按“描述”分组并求和.我正在尝试学习LINQ,并且一直在尝试使用GroupBy来实现这一点,但是我却一无所获.请有人提供如何实现此目的的示例.非常感谢,科林.

解决方法:

在LINQ中使用语法查询:

userData = from spend in allSpend
           from monthSpend in spend.Spend
           from spendDetail in monthSpend.Detail
           group spendDetail by new {spend, spendDetail.Description} into g
           select new UserDataPoint
           {
               User = g.Key.spend.UserName,
               Category = g.Key.Description,
               Spend = g.Sum(t => t.Amount)
           };

这里的困难是按多个列(用户名和类别)分组.该操作是在组中使用匿名类型完成的,该方法由{spend,SpendDetail.Description}组成.查看Stackoverflow

更新资料

这是一个更好的版本(不需要复杂的GroupBy):

userData = from spend in allSpend
           from userDataPoint in
               (from monthSpend in spend.Spend
               from spendDetail in monthSpend.Detail
               group spendDetail by spendDetail.Description into g
               select new UserDataPoint
               {
                   User = spend.UserName,
                   Category = g.Key,
                   Spend = g.Sum(t => t.Amount)
               })
           select userDataPoint;

标签:linq,c,group-by
来源: https://codeday.me/bug/20191123/2064151.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有