我有一个对象模型MyObject,它包含一个可为空的字节作为其属性之一。 如何对此关键字上的MyObjects列表进行排序,以便根据此属性的值以升序对列表进行排序,最后出现null的对象。使用LINQ排序具有空属性的对象的列表
感谢您的建议。
我有一个对象模型MyObject,它包含一个可为空的字节作为其属性之一。 如何对此关键字上的MyObjects列表进行排序,以便根据此属性的值以升序对列表进行排序,最后出现null的对象。使用LINQ排序具有空属性的对象的列表
感谢您的建议。
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());
创建IComparer<byte?>
接口的自定义实现。
使用??
运营商强制null
值后,像这样:
var res = myList.OrderBy(v => (uint?)v.NullableByteProp ?? uint.MaxValue);
你需要转换为uint?
,否则你的空值将会排序r与你的0xFFs。
这将创建一个序列,255和空值的值将散布在最后。 – phoog 2012-01-10 20:37:27
@phoog是的,我也注意到了,并且很快添加了一个修复:) – dasblinkenlight 2012-01-10 20:38:52
可以使用GetValueOrDefault()函数来提供一个值时,空等于Byte.MaxValue
var orderedValues = values.OrderBy(v => v.GetValueOrDefault(Byte.MaxValue));
默认情况下,nullables地方比较器'null'第一(小于一切),所以你会需要定制'IComparer'。 –
2012-01-10 20:37:07
可能的重复[C# - IComparer - 如果日期时间为空,那么应该排序到底部而不是顶部](http://stackoverflow.com/questions/4734055/c-sharp-icomparer-if-datetime-is-null - 然后应该被分类到底部 - 否) – 2012-01-10 20:37:29