C# - IComparer - If datetime is null then should be sorted to the bottom not the top

前端 未结 3 1641
旧时难觅i
旧时难觅i 2021-02-09 08:29

I have a list of dates that I want to sort in an ascending order. However, the default comparer means that I have:

null
null
18/01/2011
23/01/2011
相关标签:
3条回答
  • 2021-02-09 08:40
    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
    }
    

    No extra null checking is required.

    0 讨论(0)
  • 2021-02-09 08:50

    Here's a generic comparer that should work for pretty much any type:

    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);
        }
    }
    
    0 讨论(0)
  • 2021-02-09 08:50

    You could try this:

    messages.Sort((x, y) => (x.CreatedOn ?? DateTime.MaxValue).CompareTo(y.CreatedOn ?? DateTime.MaxValue));
    
    0 讨论(0)
提交回复
热议问题