如何在C#中对通用列表进行排序,并允许空项首先出现在列表中?

如何在C#中对通用列表进行排序,并允许空项首先出现在列表中?,c#,generics,comparison,C#,Generics,Comparison,我在C#中有一个对象的通用列表,例如,这里是对象可能是什么 public class Thing { public string Name { get; set; } public DateTime EditDate { get; set; } } var things = new List<Thing>(); 但是,我的某些EditDate属性为空。我希望这些具有null EditDate属性的对象显示在列表的顶部(即接近零索引)。我如何才能做到这一点?列表中有

我在C#中有一个对象的通用列表,例如,这里是对象可能是什么

public class Thing {
    public string Name { get; set; }
    public DateTime EditDate { get; set; }
}

var things = new List<Thing>();
但是,我的某些EditDate属性为空。我希望这些具有null EditDate属性的对象显示在列表的顶部(即接近零索引)。我如何才能做到这一点?

列表中有一个接受委托的列表

现在我已经读过这个问题了

TheList.Sort(int delegate(Type a, Type b)
{
    if (a.memeber == null) return -1;
    if (b.memeber == null) return 1;
    if (a.memeber<b.memeber) return -1;
    if (b.memeber<a.memeber) return 1;
    return 0;
}
t列表排序(int委托(类型a、类型b)
{
if(a.memeber==null)返回-1;
if(b.memeber==null)返回1;

如果(a.memeber您可以创建更复杂的lambda,例如:

things.Sort((t1, t2) => 
{
 if (t1 == null)
 {
   return (t2 == null) ? 0 : -1;
 }
 if (t2 == null)
 {
   return 1;
 }
 return t1.EditDate.CompareTo(t2.EditDate);
});

<代码>结束日期< /代码>不能是“代码> null <代码>,因为它是一个值类型。但是,如果您有一个特定的值,即<代码>结束日期<代码>,您认为是“代码> null <代码>,您可以修改上述代码,以类似的方式来考虑我如何应对<代码> T1 或<代码> T2 <代码> NULL/COD> >

事物实现IComparable,使EditDate为空的事物的顺序高于具有编辑日期的事物。然后修改排序表达式以对对象而不是编辑日期进行排序。

来自ffpf的答案应该有效

但是如果你有时间阅读这篇关于BCL团队使用空值排序的文章


在给定的示例中,您使用的是DateTime类型,不能为null。您能澄清一下示例或问题吗?标题有点误导,问题是关于比较,只是间接地关于排序。您可能需要编辑它以澄清这一点。您应该将==切换为Object.Reference equals。您正在查找Object Identiity但要求对象相等。遗憾的是,这是两个不同的项,在C#中只有一个构造。在本例中,您的代码可以工作。但在更抽象的示例中,可能有人重载==而不是引用标识(例如字符串)。在这种情况下,可以对null进行不同的解释,并给出有趣的结果。
things.Sort((t1, t2) => 
{
 if (t1 == null)
 {
   return (t2 == null) ? 0 : -1;
 }
 if (t2 == null)
 {
   return 1;
 }
 return t1.EditDate.CompareTo(t2.EditDate);
});