2012-01-10 74 views
2

我有一个对象模型MyObject,它包含一个可为空的字节作为其属性之一。 如何对此关键字上的MyObjects列表进行排序,以便根据此属性的值以升序对列表进行排序,最后出现null的对象。使用LINQ排序具有空属性的对象的列表

感谢您的建议。

+0

默认情况下,nullables地方比较器'null'第一(小于一切),所以你会需要定制'IComparer '。 – 2012-01-10 20:37:07

+0

可能的重复[C# - IComparer - 如果日期时间为空,那么应该排序到底部而不是顶部](http://stackoverflow.com/questions/4734055/c-sharp-icomparer-if-datetime-is-null - 然后应该被分类到底部 - 否) – 2012-01-10 20:37:29

回答

9

Linqs OrderBy带有过载,接受IComparer。通过这种方式,您可以将所有对象按您想要的方式排序。

简单的例子:

public class NullByteComparer : IComparer<byte?> 
{ 
    public int Compare(byte? a, byte? b) 
    { 
     if (a == b) 
      return 0; 
     if (a == null) 
      return 1; 
     if (b == null) 
      return -1; 
     return return a < b ? -1 : 1; 
    } 
} 

使用它

yourObjects.OrderBy(x => x.NullByteProperty, new NullByteComparer()); 
3

创建IComparer<byte?>接口的自定义实现。

1

使用??运营商强制null值后,像这样:

var res = myList.OrderBy(v => (uint?)v.NullableByteProp ?? uint.MaxValue); 

你需要转换为uint? ,否则你的空值将会排序r与你的0xFFs。

+1

这将创建一个序列,255和空值的值将散布在最后。 – phoog 2012-01-10 20:37:27

+0

@phoog是的,我也注意到了,并且很快添加了一个修复:) – dasblinkenlight 2012-01-10 20:38:52

1

可以使用GetValueOrDefault()函数来提供一个值时,空等于Byte.MaxValue

var orderedValues = values.OrderBy(v => v.GetValueOrDefault(Byte.MaxValue)); 
+0

这也会创建一个序列,255和空值的值将在最后散布。 – phoog 2012-01-10 20:38:57

+0

这与@ dasblinkenlight的解决方案非常相似。我记得他的答案(使用合并运算符而不是GetValueOrDefault)对LINQ-to-Entities更友好一点,尽管它更容易转换为SQL。 – Reddog 2012-01-10 20:39:20

相关问题