将缺少的枚举添加到列表 C#

Adding missing Enumerations into the list C#

我写了下面的代码,基本上按天对我的销售额进行分组,然后我在图表上向用户展示它们,如下所示:

   var DailyGraph = userStores.ToList().GroupBy(x => x.TransactionDate.Value.DayOfWeek).Select(pr => new { Day = pr.Key.ToString(), Sales = pr.Sum(x => x.QuantitySoldTransaction) });
   var dayIndex = new List<string> { "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" };
   ViewBag.DailyGraph = DailyGraph.OrderBy(e => dayIndex.IndexOf(e.Day.ToUpper())).ToList();

好吧,这里发生了什么,在第一行中,我将所有可用的销售额按星期几参数(即 Enumeration)分组...然后我创建了一个字符串列表,其中包含确切的日期名称,例如 Enumeration,我比较他们这样我就可以随着时间的推移(从周一到周日)准确地订购它们...

我现在的问题是,如果用户在特定日期没有销售...假设周一和周四他没有销售...我现在如何将这些缺失的日子添加到我的列表中?由于我正在使用枚举,所以我对如何做到这一点感到有点困惑...

因此当前输出为:

Tuesday    5 sales
Wednesday  9 sales
Friday     4 sales
Saturday   13 sales
Sunday     5 sales

所需的输出是:

Monday     0 sales // Add missing day enumeration and assign 0 value
Tuesday    5 sales
Wednesday  9 sales
Thursday   0 sales // Add missing day enumeration and assign 0 value
Friday     4 sales
Saturday   13 sales
Sunday     5 sales

有人可以帮我吗?

丹,是这样的吗?

for (int i = 0; i < DailyGraph.Count(); i++)
                    {
                        if (!dayIndex.Contains(DailyGraph[i].Day.ToUpper()))
                        {
                            DailyGraph.Add(new HourlyGraph { Day = dayIndex.ElementAt(i), Sales = 0 });
                        }
                    }

您可以在末尾添加缺少的日期,例如:

DailyGraph.AddRange(
   dayIndex.Except(DailyGraph.Select(t => t.Day)).Select(r => new { Day = r, Sales = 0 }));

首先,我不会使用字符串作为您的密钥,因为如果有人不使用英语,这可能不起作用。

你可以这样做:

var dayIndex = new List<DayOfWeek> { DayOfWeek.Monday, DayOfWeek.Tuesday, /* etc */   };
var DailySales = dayIndex.Select(d => new { Day = d, Sales =
     userStores.Where(x => x.TransactionDate.Value.DayOfWeek == d)
     .Sum(u => u.QuantitySoldTransaction) }).ToList();

获取一周中所有可用的日子,并与您计算的每日图表进行左外连接:

var DailyGraph = userStores.ToList().GroupBy(x => x.TransactionDate.Value.DayOfWeek).Select(pr => new { Day = pr.Key, Sales = pr.Sum(x => x.QuantitySoldTransaction) });

from day in Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>()
from graph in DailyGraph.Where(g => g.Day == day).DefaultIfEmpty()
select new 
{
   Day = day.ToString(),
   Sales =  graph == null ? 0 : graph.Sales 
}

您可以使用 .ToLookup() 子句,并注意假设您的视图模型是

,您的日期名称列表并不是真正必要的
public class HourlyGraph
{
    public DayOfWeek Day { get; set; }
    public int Sales { get; set; }
}

查询是

var lookup = userStores.ToLookup(x => (int)x.TransactionDate.DayOfWeek);
ViewBag.DailyGraph = from day in Enumerable.Range(0, 7)
                     select new HourlyGraph
                     {
                         Day = (DayOfWeek)day,
                         Sales = lookup[day].Sum(x => x.QuantitySoldTransaction)
                     };

请注意,记录将按周日到周六的顺序打印