2011-01-19 31 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)); 
相关问题