繁体   English   中英

如何按子类属性为父类列表排序?

[英]How to do order by child class property for a list of parent class?

在这里,父类在子类中具有子类,我们通过使用子类的name属性来命名如何将父列表作为订单。 我使用了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; }
        }

如果您只想要有序列表,可以使用以下命令:

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

如果要在结果List的末尾具有Class1为null的那些对象:

var assa = pq.Where(p => p.Class1 != null).OrderBy(p => p.Class1.Name).ToList();
assa.AddRange(pq.Where(p => p.Class1 == null));

只需使用Name属性作为调用OrderBy函数的参数,即可获得所需的结果:

var assa = pq.OrderBy(z => z.Class1.Name).ToList();

您的代码中的问题是您提供了一个用于确定顺序的布尔标准。 由于列表中所有根据此条件检查的元素都将返回true->顺序保持不变。 您可以通过将最后一项的名称设置为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();

问题是您的订购功能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM