0

売り上げのリストがあります。

また、財務マイルストーンの10進数のリストもあります。たとえば、100ドル、250ドル、500ドルなどです。

製品がこれらのマイルストーンに到達する時点を見つけようとしています。以下で私がやろうとしているのは、すでに取得したproductSalesのリストを使用できる構造にすることです(実際のクエリは通貨換算などを実行します。この質問を単純にしようとしています)。したがって、マイルストーンごとに、これをこのBusinessPlanningElementリストに変換し、DateSoldでグループ化します。

次に、DateSoldで並べ替えます。これは、10進数のマイルストーン変数以上の最初の要素を取得するという考え方です。その後、日付を取得し、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
    }

}

デバッグすると、リストが表示され、このクエリから取得する必要のあるリスト内のアイテムが表示されます。

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

ただし、それを無視しているようで、null値を返します。

TotalSalesが10進数のマイルストーン以上であるリストの最初の要素を取得するために、クエリを構造化する方法を知っている人はいますか?

4

2 に答える 2

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();
于 2012-12-06T16:09:12.617 に答える
1

ここで、コードを少しリファクタリングする自由を取りました。書かれているように、各マイルストーンの合計を再計算しますが、現在の合計を1回だけ計算してから、それらを調べて各マイルストーンを見つける方が理にかなっています。これはうまくいくと思いますが、もちろんテストしてください。

//Order the sales info by date. If it's already ordered then remove this.
productSales = productSales.OrderBy(ps => ps.DateSold).ToList();

//Compute a list of dates, with total sales up to that date
decimal runningTotal = 0m;
var salesRunningTotals = (from sale in productSales
                            select new
                            {
                                DateSold = sale.DateSold,
                                TotalSalesToDate = (runningTotal += (sale.TotalProductCut ?? 0))
                            })
                            .ToList(); 

foreach (decimal milestone in milestones)
{
    //Find the date we reached that milestone
    //If you're going to have a *lot* of dates you could remember the index of the last milestone
    //and start looking for the next one at that index
    var dateReached = (from rt in salesRunningTotals
                        where rt.TotalSalesToDate >= milestone
                        select rt.DateSold).FirstOrDefault();

    if (dateReached != null)
    {
        var bpe = productSales.Where(ps => ps.DateSold == dateReached).FirstOrDefault();

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

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

別の可能な改善-特定のマイルストーン(たとえば、100)に到達していない場合は、明らかに高いマイルストーンに到達していません。それを覚えて、将来のループ反復の検索をスキップすることができます。

于 2012-12-06T16:31:38.963 に答える