昨天我发布了以下关于如何使用 LINQ 将使用“组”的具有多个级别的对象转换为平面结构的问题:
Cédric Bignon 非常友好地回答了这个问题。我想要这种转换的原因是我可以用 userData 变量填充 ComponentArt 的 Silverlight XYChart 组件。但是,我刚刚发现在以堆叠条格式显示时,它们的组件存在一个已知错误。如果数据中存在空白,则无法正确显示,因此我需要确保所有用户对 Category 的所有不同值都有一个值。因此,在我最初的问题中,我已经放置了我希望 userData 填充的内容,我需要确保 [User = "Bob", Category = "International", Spend = 0.00] 也存在于结果。
在您给我的 LINQ 语句之后,我通过使用以下代码实现了这一点:
// LINQ Statement provided by @Cedric
var 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;
// END
List<UserDataPoint> userDataNoGaps = new List<UserDataPoint>();
userDataNoGaps = userData.ToList();
foreach (string strCategory in userData.Select(c => c.Category).Distinct())
{
var existing = userData.Where(c => c.Category == strCategory).Select(c => c.User);
userDataNoGaps.AddRange(userData.Where(c => !existing.Contains(c.User)).Select(c => new UserDataPoint() { User = c.User, Category = strCategory, Spend = 0 }));
}
但是当我有超过 1000 个用户和几个类别时,我的代码非常慢。这是否可以以某种方式合并到 Cédric 提供的 LINQ 语句中,还是我最好使用上面的代码来填补空白?