可枚举的OrderBy - 总是处理为高或低的空值,这可以被认为是稳定的行为吗?

sil*_*vis 18 c# sorting null

我正在排序一些IEnumerable对象:

var sortedObjects = objects.OrderBy(obj => obj.Member)
Run Code Online (Sandbox Code Playgroud)

成员属于某一IComparable类型.这种似乎把对象obj.Member == null放在顶部.这大致是我想要的行为,但是我可以认为这对于未来的.NET框架来说是稳定的吗?有没有办法让这种'空虚低'的行为更明确?

Che*_*hen 23

使行为更明确:

var sorted = objects.OrderBy(o => o.Member == null).ThenBy(o => o.Member);
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道空值总是比较低,那么这是不必要的,但它确实让您明确控制它们是首先出现还是最后出现,无论您订购非空值的方向如何。请注意,上面的代码实际上颠倒了默认行为,因为当 Member == null 时,值为 true (1),导致 null 的排序晚于非 null。 (2认同)

Jas*_*own 18

来自MSDN的IComparable:

根据定义,任何对象都比较大于(或跟随)null,并且两个空引用相互比较相等.

因此,null对象被认为小于非null对象.如果按升序排序,您将首先获得空值.


Pet*_*ete 5

一种选择是使用带IComparer <T>的OrderBy的重载,并自己实现以将这种期望编码化:

http://msdn.microsoft.com/en-us/library/bb549422.aspx