使用LINQ对具有空属性的对象列表进行排序

3
我有一个对象模型MyObject,其中包含一个可空字节作为其属性之一。如何根据此键对MyObjects列表进行排序,以使列表按照该属性值升序排序,并在具有null的对象最后出现。
谢谢您的建议。

默认情况下,对于可空类型,比较器将null放在第一位(小于所有其他值),因此您需要一个自定义的IComparer<T> - James Michael Hare
4个回答

9
Linq的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?,否则你的 null 值会与 0xFF 值一起排序。

1
这将创建一个序列,在其中值为255和空值将交替出现在末尾。 - phoog
@phoog 是的,我也注意到了,并迅速加入了修复措施 :) - Sergey Kalinichenko

1

您可以使用GetValueOrDefault()函数,在null等于Byte.MaxValue时提供一个值。

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

这也会创建一个序列,在其中值为255和空值将交替出现在末尾。 - phoog
这与@dasblinkenlight的解决方案几乎完全相同。我记得他的答案(使用合并运算符而不是GetValueOrDefault)在更适用于LINQ-to-Entities,因为它更容易被转换为SQL。 - Reddog

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