4

我正在尝试对多个属性上的视图模型绑定进行排序。问题是第二个属性可能为空,我得到一个空引用异常。

return this.People
  .OrderBy(x => x.Car.Name)
  .ThenBy(x => x.Pet.Name);

如果 Pet 为空怎么办?我如何仍然按 Pet.Name 进行 ThenBy 排序?

4

4 回答 4

10

这应该在非 null Pets 之前返回 null Pets。

return this.People
  .OrderBy(x => x.Car.Name)
  .ThenBy(x => x.Pet != null ? x.Pet.Name : "");
于 2012-07-01T00:01:31.757 回答
3

如果你想让没有宠物的人排在有宠物的人之上,你可以使用这个:

return this.People
  .OrderBy(x => x.Car.Name)
  .ThenBy(x => x.Pet == null ? string.Empty : x.Pet.Name);

如果您要进行许多涉及宠物的排序操作,您可以创建自己的PetComparer继承自 的类Comparer<Pet>,如下所示:

public class Pet
{
    public string Name { get; set; }
    // other properties
}

public class PetComparer : Comparer<Pet> // 
{
    public override int Compare(Pet x, Pet y)
    {
        if (x == null) return -1; // y is considered greater than x
        if (y == null) return 1; // x is considered greater than y
        return x.Name.CompareTo(y.Name);
    }
}

现在,您的查询将如下所示:

return this.People
  .OrderBy(x => x.Car.Name)
  .ThenBy(x => x.Pet, new PetComparer());

注意:这将与此答案顶部的查询相反 - 它将没有宠物的人排序到底部(在汽车名称内)。

于 2012-07-01T00:01:30.230 回答
2

您可以对宠物和汽车使用Null 对象模式,以避免在这种情况下对 null 进行任何额外检查,并将可能的NullReferenceException.

于 2012-07-01T00:10:27.923 回答
0

一起使用 null 条件 ( ?.) 和 null 合并 ( ??) 运算符,您可以做到这一点 -

return this.People
  .OrderBy(x => x.Car.Name)
  .ThenBy(x => x.Pet?.Name ?? string.Empty);
于 2019-06-07T10:21:27.273 回答