如何通过子类属性为父类列表进行排序?

时间:2017-07-17 14:07:24

标签: c# linq

这里父类在子类中有子类我们有名称如何使用子类的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; }
        }

3 个答案:

答案 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();