1

理解に苦しむいくつかの動作が見られます。s のリストをDateTime指定して、過去 1 年間に発生した日付のみを降順で選択したいと考えています。でもOrderBy()OrderByDescending()、を使っているのSkipWhile()は……おかしい。次のような過去 100 か月を含む、今日から始まるリストを指定します。

List<DateTime> ldt = new List<DateTime>();
for (int i = 0; i < 100; i++)
{
    ldt.Add(DateTime.Now.AddMonths(-i));
}

私は次のコードから始めました:

ldt = ldt.OrderByDescending(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();

これにより、リストが適切に並べ替えられますが、レコードがスキップされることはありません。楽しみのために、私はこれを試しました(今日より前のすべて、つまりすべてをスキップします):

 ldt = ldt.OrderByDescending(date => date).
            SkipWhile(date => date <= DateTime.Now).ToList();

どちらが機能します。リストが空です。次に、次のことを試しました(OrderByDescendingではなくOrderBy):

ldt = ldt.OrderBy(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList(); 

これは期待どおりに機能します-リストは順序付けられ、日付は適切にフィルタリングされます。したがって、機能する最終結果は次のとおりです。

ldt = ldt.OrderBy(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();
ldt = ldt.OrderByDescending(date => date).ToList();

スキップしてから再注文します。それで、私は何が欠けていますか?これらのいくつかはなぜ機能し、いくつかは予測できない方法で壊れるのでしょうか? 私がやろうとしていることに対する適切な1 行のコマンドは何ですか?

4

2 に答える 2

5

TakeWhile基本的に、代わりにSkipWhile次のものが必要です。

ldt = ldt.OrderByDescending(date => date)
         .TakeWhile(date => date > DateTime.Now)
         .ToList();

を使用した後OrderByDescending、保持したいエントリは最初のものです... 一方、SkipWhileはいくつかのエントリを破棄し、残りを保持することを想定しています。

(または、Reed が示唆するように、使用してフィルター処理しWhereてから並べ替えることもできます。どちらも機能します。Reed の方が効率的かもしれません。理解しやすい方を使用してください。)

このようなことに戸惑うときは、データの例を紙に書き出すことをお勧めします。各ステップの後にシーケンスがどのように見えるかを考え出し、次に次のステップが何をするかを考えます。

于 2013-05-29T21:22:56.913 に答える
4

過去 1 年間の日付のみを選択したい

を使用する代わりにSkipWhile、次を使用できるはずです.Where

 ldt = ldt.Where(date => date.> DateTime.Now.AddYears(-1))
        .OrderByDescending(date => date).ToList();
于 2013-05-29T21:23:20.480 に答える