C# - IComparer - 如果日期时间为 null,则应该排在底部而不是顶部

8

我有一组日期需要按升序排序。然而,使用默认的比较器会导致:

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

能否有人帮忙写一个IComparer,使得按升序排序的日期看起来像这样:

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

3
你的“日期”实际上是 Nullable<DateTime>/DateTime? 还是字符串? - LukeH
3个回答

18

以下是一个通用的比较器,适用于几乎所有类型:

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
可以这样做,从来没有考虑过在 ? 类型上使用 null 操作符哈哈! - Adam Houldsworth

1
你可以尝试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接