【问题标题】:GROUPBY and SUM on List items using LINQ使用 LINQ 对列表项进行 GROUPBY 和 SUM
【发布时间】:2016-12-27 09:35:24
【问题描述】:

我有一个List 类型为DailySummary

public class DailySummary
{
    public string AffiliateID { get; set; }
    public string TotalCalls { get; set; }
    public string Date{ get; set; }
}

使用以下示例数据:

List<DailySummary> DealerTFNDatesTable = new List<DailySummary>();
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/12/2016", TotalCalls = "10"});
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/13/2016", TotalCalls = "74"});
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="1", Date = "12/22/2016", TotalCalls = "63"});
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/12/2016", TotalCalls = "58"});

现在我想检索按AffiliateID 分组的DateTotalCalls 并分配到另一个列表中。

for(int i =0; i < DealerTFNDatesTable.Count; i++)
{
    List<NewList> newList = new List<NewList>();
    newList.Date = //Assign Dintinct dates WHERE AffiliateId = 0 
    newList.AffiliateID = //AffiliateID=0
    newList.TotalCalls= //TotalCalls SUM GROUPBY DATE and AffiliateID = 0 
                        //For Date '12/12/2016' it will be 68, For '12/13/2016' it will be 74 and so on
}

对不起,我是 LINQ 的新手。有人可以帮助我或分享资源,我可以获得实现此目标的提示吗?

【问题讨论】:

    标签: c# linq group-by sum


    【解决方案1】:

    这应该适用于按 AffilateID 和 Date 进行分组,然后得到总和(尽管将数字存储为这样的字符串很奇怪,但不管你的船是什么)。

     var results = DealerTFNDatesTable
         .GroupBy(x => new { x.AffiliateID, x.Date })
         .Select(x => new DailySummary {
            AffiliateID = x.First().AffiliateID,
            Date = x.First().Date,
            TotalCalls = x.Sum(y => Convert.ToInt32(y.TotalCalls)).ToString()
         });
    

    如果您现在查看结果,例如使用此代码,您会得到您想要的值:

    foreach (var x in results) {
        Console.WriteLine($"id = {x.AffiliateID}, date = {x.Date}, totalCalls = {x.TotalCalls}");
    }
    
    > id = 0, date = 12/12/2016, totalCalls = 68
    > id = 0, date = 12/13/2016, totalCalls = 74
    > id = 1, date = 12/22/2016, totalCalls = 63
    

    【讨论】:

    • 完美而简单的解决方案。非常感谢:)
    【解决方案2】:
    var results = DealerTFNDatesTable.GroupBy(T => new { T.AffiliateID })
    

    Link

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
    【解决方案3】:

    首先,

    由于DealerTFNDatesTable 是一个变量,您应该使用驼峰式大小写。因此它是dealerTFNDatesTable

    然后完成@andy 他的答案,因为您还想做一个选择。您可以如下选择:

            var newVariable = from item in dealerTFNDatesTable
                       group item by new
                       {
                           item.Date,
                           item.AffiliateID,
                       }
                       into g
                       select new
                       {
                           Date = g.Key.Date,
                           Id = g.Key.AffiliateID,
                           Total = g.Sum(a => a.TotalCalls)
                       };
    

    这会给你一个IEnumerable,你可以通过var otherList = new List<object>(newVariable .Where(a => a.Total > 0));将相关部分放在一个列表中,或者如果你想要集合原样,只需在选择后添加.ToList()。

    请注意,这只是 LINQ 的另一种表示法,结果是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2011-03-25
      • 1970-01-01
      • 2016-06-17
      相关资源
      最近更新 更多