【问题标题】:C# Linq - Add Null Values and Week Numbers to a List when they are missingC# Linq - 将空值和周数添加到列表中,当它们丢失时
【发布时间】:2020-07-22 05:36:15
【问题描述】:

我已经成功地使用按类别和周数对列表进行分组没问题。 我面临的问题是如何添加 0 并填写缺失的 WeekNumber 值。 如果我只有“汽车”,那会很简单,但我似乎无法正确使用 Distinct() 来遍历每个类别。

当前列表:

预期结果:

如果列表中只有汽车,那么我知道我可以执行以下操作来获得整年的价值。

for (var i = 1; i <= 52; ++i)
{
   if (vehicleSales.Count(x => x.x == i) == 0)
   {
      vehicleSales.Add(new WeeklySalesBreakdown { WeekNumber = i, Value = 0, Category = "Cars" });
   }
}

感谢您的帮助和建议!

【问题讨论】:

  • 为什么您需要列表中的数据而不是稍后可以导航的对象中的数据,例如:salesBreakdownByCategory["Cars"][2] //get salesBreakdown for Cars, then get week 2

标签: c# linq distinct distinct-values


【解决方案1】:

您的示例代码可能会变慢,因为您使用 '.Count(x => xx == i)' 迭代所有条目 52 次(当您有数百万个条目时,这个滚雪球,只有几个条目,您将不太注意)。

您可以做的是将数据存储在字典中:

salesBreakdownByCategory = new Dictionary<String, int[]>();

然后你一次检查所有条目:

foreach(var breakdown in vehicleSales)
{
    int[] values;
    if(!salesBreakdownByCategory.TryGetValue(vehicleSales.Category, out values))
    {
        values = new int[52]; // every entry in the array is by default 0 
        salesBreakdownByCategory[vehicleSales.Category] = values;
    }
    values[vehicleSales.WeekNumber-1] = vehicleSales.Value;
}

这样你就可以将所有数据存储在数组中,但是如果你想要一个列表,你必须再次遍历你的数据结构:

var result = salesBreakdownByCategory.SelectMany(x=>x.Select( (value,index) => new WeeklySalesBreakdown { WeekNumber = index+1, Value = value, Category = x.Key}));

如果您想避免额外的内存分配并将数据添加到现有列表中,而不是像上面的示例那样将值存储在 int 数组中,您可以改用 bool 数组并将值设置为 true对于您找到的每个条目。然后,您只需要再次遍历字典并在 bool 未设置为 true 时将条目添加到原始列表中

【讨论】:

  • 感谢@CitrusO2 - 虽然标记了其他答案作为我现在的排序,但我一定会考虑将我的代码重构为这个。
【解决方案2】:

我稍微更改了您的代码,现在您可以为原始列表中存在的所有类别添加零值记录 1 整年(52 周):

var categories = vehicleSales.Select(v => v.Category).Distinct().ToList();
foreach(var category in categories)
{
    for (var i = 1; i <= 52; ++i)
    {
        if (!vehicleSales.Any(x => x.Category == category && x.WeekNumber == i))
        {
            vehicleSales.Add(new WeeklySalesBreakdown { WeekNumber = i, Value = 0, Category = category });
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2017-03-26
    • 2015-01-22
    • 1970-01-01
    • 2014-08-13
    • 2017-12-10
    相关资源
    最近更新 更多