达到特定财务价值时,在列表中查找项目

109*_*793 0 c# linq lambda list

我有一份销售清单.

我还有一个财务里程碑的小数列表,例如100美元,250美元,500美元等.

我试图找到产品达到这些里程碑的时间点.我在下面尝试做的是将已经检索到的productSales列表放入我可以使用的结构中(实际查询执行货币转换等等.我只是想让这个问题变得简单),所以对于每个里程碑,我将它转换为此BusinessPlanningElement列表并按DateSold分组.

然后我按DateSold对它进行排序,我的想法是检索第一个等于或大于十进制里程碑变量的元素.然后我继续获取日期,并找到DateSold与产品提交给系统的日期之间的差异.

foreach (decimal milestone in milestones)
{
    List<BusinessPlanningElement> MileStoneSales = (from sale in productSales
                      group sale by sale.DateSold into ds
                      select new BusinessPlanningElements
                      {
                          DateSold = ds.Key,
                          TotalSales = ds.Sum(it => it.TotalProductCut.HasValue ? it.TotalProductCut.Value : 0),
                      }).OrderBy(s => s.DateSold).ToList();


    BusinessPlanningElement bpe = MileStoneSales.Where(mss => mss.TotalSales >= milestone)
                                                .FirstOrDefault();

    if (bpe != null)
    {
        DateTime DateReached = bpe.DateSold;
        TimeSpan ts = DateReached - product.DateTimeSubmitted.Value;
        int NumberOfDays = ts.Days;

        //Output NumberOfDays
    }
    else
    {
        //Do Something Else
    }

}
Run Code Online (Sandbox Code Playgroud)

如果我通过调试,我可以看到列表,并查看列表中应该从此查询中检索的项:

BusinessPlanningElement bpe = MileStoneSales.Where(mss => mss.TotalSales >= milestone)
                                            .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

它似乎忽略了它,并向我返回一个空值.

有没有人有任何想法如何构建我的查询来检索列表中的第一个元素,其中TotalSales等于或大于小数里程碑?

Bob*_*son 5

尝试使用.SkipWhile().

List<BusinessPlanningElement> MileStoneSales = (from sale in productSales
                  group sale by sale.DateSold into ds
                  select new BusinessPlanningElements
                  {
                      DateSold = ds.Key,
                      TotalSales = ds.Sum(it => it.TotalProductCut.HasValue ? it.TotalProductCut.Value : 0),
                  }).OrderBy(s => s.DateSold).ToList();

decimal accumulatedSales = 0;
BusinessPlanningElement bpe = MileStoneSales
                                .SkipWhile(mss => {
                                        accumulatedSales += mss.TotalSales;
                                        return accumulatedSales < milestone;
                                 })
                                .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)