将IEnumerable的IEnumerable转换为字典

时间:2016-06-21 11:14:59

标签: c# entity-framework linq dictionary

问题是在运行

之后
 reportData = dbContext.FinancialsBySupplierAuditPeriodStatusType
                        .Where(v => v.ReviewPeriodID == reportFilter.ReviewPeriodID && v.StatusCategoryID == reportFilter.StatusCategoryID)
                        .GroupBy(s => new { s.SupplierID })

                        .Select(g => new DrilldownReportItem {
                            SupplierID = g.Key.SupplierID,
                            SupplierName = g.Max(v => v.SupplierName),
                            AccountNo = g.Max(v => v.AccountNo),
                            TempTotals = g.Select(v => new TempTotals { ClaimType = v.TypeDesc ?? "Old Claims", Amount = v.Amount })
                        }).OrderBy(r => r.SupplierName).ToList();

Temp totals是一个IEnumerable,它包含一个简单类

的IEnumerable
public class TempTotals {
    public string Type { get; set; }
    public decimal? Amount { get; set; }
}

我们的想法是获取这些数据并将其分组到一个字典中,以便我可以获得所有金额的总和,其中键是类型。

最终结果如下:

Dictionary<string, decimal> test = new Dictionary<string, decimal>() {
               {"Claim",2 },
               {"Query", 500 },
               {"Normal", 700 }
           };

我知道我可以预先知道它,但我正在寻找使用LINQ的解决方案。

2 个答案:

答案 0 :(得分:7)

试试这个:

Dictionary<string, decimal?> test =
    reportData
        .SelectMany(rd => rd.TempTotals)
        .GroupBy(tt => tt.ClaimType, tt => tt.Amount)
        .ToDictionary(g => g.Key, g => g.Sum());

由于Amount的类型为decimal?,因此字典值也为decimal?

答案 1 :(得分:1)

试试这个:

IEnumerable<IEnumerable<TempTotals>> yourCollection;

var dictionary = yourCollection.SelectMany(s => s).ToDictionary(k => k.Type, v => v.Amount);

dictionary的位置Dictionary<string, decimal>。但是你需要确保你没有两个TempTotals具有相同的Type