这里父类在子类中有子类我们有名称如何使用子类的name属性将父列表作为orderby。我使用了pq.OrderBy(z => z.Class1.Name!= null).ToList();但是列表没有按预期排序。
class Program
{
static void Main(string[] args)
{
List<Parent> pq = new List<Parent>() {
new Parent () { Class1=new Child () { Name="d" } },
new Parent () { Class1=new Child () { Name="s" } },
new Parent () { Class1=new Child () { Name="y" } },
new Parent () { Class1=new Child () { Name="r" } },
new Parent () { Class1=new Child () { Name="b" } },
new Parent () { Class1=new Child () { Name="a" } }
};
var assa = pq.OrderBy(z => z.Class1.Name != null).ToList();
}
}
public class Parent
{
public Child Class1 { get; set; }
}
public class Child
{
public string Name { get; set; }
}
答案 0 :(得分:2)
如果您只想要一个有序列表,可以使用:
var assa = pq.OrderBy(p => p.Class1.Name).ToList();
如果Class1
属性可能为null,请使用:
var assa = pq.Where(p => p.Class1 != null).OrderBy(p => p.Class1.Name).ToList();
如果您想在结果Class1
的末尾使List
为空的对象:
var assa = pq.Where(p => p.Class1 != null).OrderBy(p => p.Class1.Name).ToList();
assa.AddRange(pq.Where(p => p.Class1 == null));
答案 1 :(得分:1)
只使用属性Name
作为OrderBy
函数调用的参数,您就可以获得所需的结果:
var assa = pq.OrderBy(z => z.Class1.Name).ToList();
您的代码中的问题是您给出了一个布尔标准,用于确定排序。由于根据此条件检查的列表中的所有元素都将返回true - &gt;订单保持不变。您可以通过将最后一项的名称设置为null
来测试它。
new Parent () { Class1=new Child () { Name="d" } },
new Parent () { Class1=new Child () { Name="s" } },
new Parent () { Class1=new Child () { Name="y" } },
new Parent () { Class1=new Child () { Name="r" } },
new Parent () { Class1=new Child () { Name="b" } },
new Parent () { Class1=new Child () { Name=null } }
在这种情况下,您的原始查询将导致最后一项的排序为第一项
var assa = pq.OrderBy(z => z.Class1.Name != null).ToList();
答案 2 :(得分:1)
问题在于您的订购功能:
var assa = pq.OrderBy(z => z.Class1.Name != null).ToList();
如果您注意到,您将从函数返回一个布尔值:
z => z.Class1.Name != null
您想要的是返回Name属性的值:
z => z.Class1.Name
将其更改为:
var assa = pq.OrderBy(z => z.Class1.Name).ToList();