2015-10-27 25 views
0

我必須按照承包商名稱使用以下邏輯來訂購以下產品:首先是父母后面接着子女的列。在linq中訂購多種方案

enter image description here

例如這裏的形象,我想這樣的結果:

  1. 第一行應該是行乞心理健康CTR /地區1因爲它是第一個父(按字母訂購);
  2. 第二行應該是Panhandle Medical Health Centre - Sidney因爲它是按字母順序排列的第一個孩子;
  3. 第三行應該是地區1 - 潘漢德爾防治聯盟
  4. 下一行應該是接下來的父母,其次是他的孩子等等。

我已經嘗試過類似這樣的事情,但我確定它不是正確的方法,它仍然不能滿足所有情況。

.AsEnumerable().OrderBy(x => x.ContractorName.Split(' ').First()).ThenBy(p=>p.ParentName).ToList<ContractModel.providers>() 
+0

你有父/子或多個級別的一個水平?如果多個級別需要遞歸方法。 – jdweng

+0

只是父母/子女的一個級別 –

+0

這種行爲與我期望的代碼一樣,那裏顯示的列表有什麼問題? – Dhunt

回答

1

要獲得你在找什麼,你需要做如下:

.AsEnumerable() 
    .Where(p => p.IsParent) 
    .OrderBy(p => p.ContractorName) 
    .SelectMany(p => 
     { 
      // You will return this list 
      var list = new List<YourType>(); 
      // First you add the parent 
      list.Add(p); 
      // Then you add all the children ordered by name 
      // (I assume you can get them via a relation) 
      list.AddRange(p.Children.OrderBy(c => c.ContractorName).ToList()); 
      // Finally you return the list 
      return list; 
     }).ToList(); 

的邏輯在這裏是第一次提取是父母的記錄,然後串聯了所有的孩子。 SelectMany將訣竅返回List

0

創建CompareTo方法

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Contractors> contractors = new List<Contractors>() { 
       new Contractors() { ContractorName = "Panhandle Mental Health Center - Sidney", ParentName = "Panhandle Mental Health Ctr/Region 1"}, 
       new Contractors() { ContractorName = "Panhandle Mental Health Center - Sidney", ParentName = "Panhandle Mental Health Ctr/Region 1"}, 
       new Contractors() { ContractorName = "Panhandle Mental Health Ctr/Region 1"}, 
       new Contractors() { ContractorName = "Region 1 - Panhandle Prevention Coalition", ParentName = "Panhandle Mental Health Ctr/Region 1"}, 
       new Contractors() { ContractorName = "Region 1 Behavioral Health - Ave. D. Scottsbluff",ParentName = "Region 1 Behaviorial Health Authority"}, 
       new Contractors() { ContractorName = "Region 1 Behavioral Health Authority"}, 
       new Contractors() { ContractorName = "Region 1 Behavioral Health Authority - 16 St Scottsbluff", ParentName = "Region 1 Behaviorial Health Authority"}, 
      }; 
      contractors.Sort((x,y) => x.CompareTo(y)); 
     } 
    } 
    public class Contractors : IComparable< Contractors> 
    { 
     public string ContractorName { get; set; } 
     public string ParentName { get; set; } 


     public int CompareTo(Contractors contractor) 
     { 
      if (this.ContractorName == null || this.ContractorName.CompareTo(contractor.ContractorName) == 1) 
       return 1; 
      if (contractor.ContractorName == null || this.ContractorName.CompareTo(contractor.ContractorName) == -1) 
       return -1; 
      if (this.ParentName == null || this.ParentName.CompareTo(contractor.ParentName) == 1) 
       return 1; 
      if (this.ParentName == null || this.ParentName.CompareTo(contractor.ParentName) == -1) 
       return -1; 
      return 0; 

     } 

    } 

} 
​