2017-07-17 87 views
-1

这里父类在子类中有子类我们有名称如何使用子类的名称属性将父列表作为order。我用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

你尝试过什么?这似乎是'OrderBy'的一个非常简单的使用,所以知道你已经尝试了什么以及你在哪里遇到了问题(编译问题,运行时异常,没有正确排序等)会很有用。 – Chris

+4

'pq.OrderBy(z => z.Class1.Name)'? – David

+0

对不起,如果问题是愚蠢的我是新来的LINQ –

回答

1

使用简单地作为OrderBy函数的调用的参数属性Name,你会得到你想要的结果:

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

@BhuvaneshNarayanasamy你怎么测试它? 'pq'仍然具有相同的顺序。返回列表'assa'将得到有序的元素 –

2

如果你只是想要一个有序的列表,你可以使用这个:

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

如果可能Class1属性为空使用此:

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)); 
+0

谢谢它的工作 –

+0

不客气。如果它解决了你的问题,请标记为正确的答案。 –

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(); 
相关问题