使用 LINQ 对列表项进行 GROUPBY 和 SUM

Fac*_*der 1 c# linq group-by sum

我有一个List类型DailySummary

public class DailySummary
{
    public string AffiliateID { get; set; }
    public string TotalCalls { get; set; }
    public string Date{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

具有以下示例数据:

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"});
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

抱歉,我是 LINQ 新手。有人可以帮助我或分享资源,我可以在其中获得实现此目标的提示吗?

Sta*_*eff 5

这应该适用于按 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()
     });
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)