2011-01-19 16 views
6

我有一個我想按升序排序的日期列表。然而,默認的比較意味着我必須:C# - IComparer - 如果日期時間爲空,那麼應該排序到底部而不是頂部

null 
null 
18/01/2011 
23/01/2011 

能有人用IComparer的幫助,這將意味着,在升序排序的日期將是這樣的:

18/01/2011 
23/01/2011 
null 
null 

謝謝, 大衛

+3

是你的 「日期」,其實`可空`/`日期時間`或者他們是字符串? – LukeH 2011-01-19 10:22:17

+0

他們是DateTime? – 2011-01-19 10:23:58

回答

17

這裏有一個通用的比較器應爲幾乎任何類型的工作:

var yourList = new List<DateTime?> 
        { 
         null, new DateTime(2011, 1, 23), 
         null, new DateTime(2011, 1, 18) 
        }; 

var comparer = new NullsLastComparer<DateTime?>(); 
yourList.Sort(comparer); // now contains { 18/01/2011, 23/01/2011, null, null } 

// ... 

public sealed class NullsLastComparer<T> : Comparer<T> 
{ 
    private readonly IComparer<T> _comparer; 

    public NullsLastComparer() : this(null) { } 

    public NullsLastComparer(IComparer<T> comparer) 
    { 
     _comparer = comparer ?? Comparer<T>.Default; 
    } 

    public override int Compare(T x, T y) 
    { 
     if (x == null) 
      return (y == null) ? 0 : 1; 

     if (y == null) 
      return -1; 

     return _comparer.Compare(x, y); 
    } 
} 
5
public class DateTimeComparer : IComparer<DateTime?> 
{ 
    #region IComparer<DateTime?> Members 

    public int Compare(DateTime? x, DateTime? y) 
    { 
     DateTime nx = x ?? DateTime.MaxValue; 
     DateTime ny = y ?? DateTime.MaxValue; 

     return nx.CompareTo(ny); 
    } 

    #endregion 
} 

不需要額外的空檢查。

+1

不錯。爲什麼不縮短到`DateTime nx = x ?? DateTime.MaxValue;` – Ani 2011-01-19 10:33:42

1

你可以試試這個:

messages.Sort((x, y) => (x.CreatedOn ?? DateTime.MaxValue).CompareTo(y.CreatedOn ?? DateTime.MaxValue)); 
相關問題