7

オブジェクトのリストがあります:List<FakeObject> list = ...

各オブジェクトには DateTime プロパティがあります。これを「Date」と呼びましょう。

このリストをこの日付プロパティで降順に並べ替えたいと思います。しかし、試してみると

list.Sort(new Comparison<FakeObject>((x, y) => DateTime.Compare(x.Date, y.Date)))

Date プロパティは null 許容になる可能性があるため、問題が発生します。

このリストをソートするにはどうすればよいですか? null 許容の日付を MAX DATE として扱い、一番上に表示されるようにします。私にとって簡単で簡単な代替手段は、Date フィールドを null 可能にしないことですが、現時点ではそれができないとしましょう。

要するに、DateTimeがnullになる可能性がある場合、DateTimeでオブジェクトのリストをソートするにはどうすればよいですか?

4

5 に答える 5

16

1つの可能なアプローチは次のとおりです。

list.Sort(new Comparison<FakeObject>((x, y) => 
    -DateTime.Compare(x.Date ?? DateTime.MaxValue,
        y.Date ?? DateTime.MaxValue)));

更新:MaxDate OPが明確化のために質問を編集した後に使用するように変更されました。

これはどちらの方法でも実行できることに注意してください (MinDateまたはMaxDate)。肝心なのはこれnullです。それなら、あなたが望むものを達成するための静的な値を与えてください。

于 2013-11-01T18:42:17.400 に答える
6

すべての null 日付を最大日付値に変換する場合は、関数でそれを行うだけです。このためのより簡潔な構文には、null 合体演算子を使用できます。

list.Sort((x, y) => 
    DateTime.Compare(x.Date ?? DateTime.MaxValue, y.Date ?? DateTime.MaxValue))
于 2013-11-01T18:42:48.523 に答える
0

私はこのようなことをします。

まず、このようなクラスが与えられた場合

class Widget
{
    public DateTime? DateCreated { get ; set ; }
}

次のようなカスタム比較子を作成します。

class Widget
{
  public DateTime? DateCreated { get ; set ; }
}

class WidgetComparer : IComparer<Widget> , IComparer<DateTime?>
{
  public bool NullCollatesHigh { get ; private set ; }
  private WidgetComparer( bool nullCollatesHigh )
  {
    this.NullCollatesHigh = nullCollatesHigh ;
    return ;
  }

  public int Compare( Widget x , Widget y )
  {
    int cc ;

    if      ( x == null && y == null ) cc = 0 ;
    else if ( x != null && y != null ) cc = Compare( x.DateCreated , y.DateCreated ) ;
    else if ( NullCollatesHigh       ) cc = x == null ? +1 : -1 ;
    else                               cc = x == null ? -1 : +1 ;

    return cc ;
  }
  public int  Compare(DateTime? x, DateTime? y)
  {
    int cc ;

    if      ( x == null && y == null ) cc = 0 ;
    else if ( x != null && y != null ) cc = DateTime.Compare( x.Value , y.Value ) ;
    else if ( NullCollatesHigh       ) cc = x == null ? +1 : -1 ;
    else                               cc = x == null ? -1 : +1 ;

    return cc ;
  }

}

それなら簡単な問題です

widgetList.Sort( new WidgetComparer( true/false ) ) ;

wheretrueは、NULL を他の何よりも上位で照合し、他falseの何よりも下位で照合するように指定します。

于 2013-11-01T19:33:26.057 に答える
0

比較の前に、null 日付インスタンスを MAX に設定するのはどうですか?

list.ForEach(x => x.Date = x.Date ?? null : DateTime.Max : x.Date);

...あなたの比較への呼び出しが続きます..

于 2013-11-01T18:42:48.743 に答える