2013-10-05 61 views
2
var CustomStatus = new[] { "PAG", "ASG", "WIP", "COMP", "SEN" }; 

List<CDSHelper> HelperList = new List<CDSHelper>(); 
// Getting the values from API to fill the object and 
// finally doing the custom order by 

var result = HelperList.OrderBy(a => Array.IndexOf(CustomStatus, a.status)); 

我使用自定義的順序排序依據的HelperList objects.I大約有18狀態完全.OUT的18個狀態我想訂購的訂單基礎上CustomStatus名單,休息應該在CustomStatus狀態後出現在列表中。使用上面的代碼,我可以在HelperList的末尾獲得CustomStatus。如何實現這個目標?Linq-問題由

+0

您是否嘗試創建一個帶有自定義狀態的列表,並添加其他法規,然後按表達式使用相同的順序? – Sruti

+0

請注意,對於大量的項目,它可能會非常緩慢。 Ordeby是O(n * log n)和索引O(n)。您的自定義順序是O(n^2 * log n)。 – qub1n

+0

是它打擊性能。但這是我的要求。另一種選擇是首先根據自定義狀態提取列表數據,並將其放入單獨的列表中,最後將非自定義狀態數據添加到列表中。哪一個最好? – Oasis

回答

3

可能做到這一點最簡單的方法是使用OrderBy然後ThenBy但您需要更改-1IndexOf如果該項目不存在,進入一個更高的值,因此項目不在列表中,最後成爲將返回。

var result = HelperList.OrderBy(a => { 
         var x = Array.IndexOf(CustomStatus, a.status); 
         if(x < 0) 
          x = int.MaxValue; 
         return x; 
        }).ThenBy(a => a.status); //Sort alphabetically for the ties at the end. 

另一種方法是反向的CustomStatus順序然後使用OrderByDecending

var CustomStatus = new[] { "SEN", "COMP", "WIP", "ASG","PAG" }; 

List<CDSHelper> HelperList = new List<CDSHelper>(); 
// Getting the values from API to fill the object and 
// finally doing the custom order by 

var result = HelperList.OrderByDecending(a => Array.IndexOf(CustomStatus, a.status)) 
         .ThenBy(a.status); 
+0

謝謝斯科特。第一個選項完美無缺。因爲我不想按字母順序排序。 – Oasis

+0

太棒了!完全幫助我你:-) – Hidan

0

用於CustomStatus創建HashSet。您不需要知道CustomStatus中的狀態索引,您只需知道它是否在列表中。在HashSet中查找是O(1)操作。在陣列中它是O(n):

var CustomStatus = new HashSet<string> { "PAG", "ASG", "WIP", "COMP", "SEN" }; 

var result = HelperList.OrderBy(a => !CustomStatus.Contains(a.status)) 
         .ThenBy(a => a.status).ToList(); 

OrderBy排序列表通過從!CustomStatus.Contains(a.status)返回的布爾值。首先包含在HashSet然後剩下的所有值。然後按照狀態按字母順序排列每個組。