2012-02-07 116 views
2

我有一份配料清單,配料名稱和相應的值。我想根據預先定義的順序進行排序。手動訂購清單C#?

List<Ingredients> frmltnIngredientsList = new List<Ingredients> 

該列表最多可以有10條記錄。前四個記錄應該是順序:

  • 蛋白
  • 光纖

和他們其餘的人可以在任何順序

+0

您與灰做飯?這對我來說是新的! :) – Benjol 2012-02-07 11:48:23

回答

12

你可以這樣做:

frmltnIngredientsList.OrderBy(item => 
    item.Name == "Protein" ? 1 : 
    item.Name == "oil" ? 2 : 
    item.Name == "Fibre" ? 3 : 
    item.Name == "Ash" ? 4 : 
    5); 

OrderBy調用將產生一個IOrderedEnumerable<Ingredient>。所以,你需要將它賦值給一個變量,

var orderedList = frmltnIngredientsList.OrderBy(item => ...); 

...或致電ToList()才能夠將其分配給您的List<Ingredient>類型的變量:

frmltnIngredientsList = frmltnIngredientsList.OrderBy(item => ...).ToList(); 

它當然也可以收拾一點點。要麼你可以有一個SortOrder屬性您Ingredient名單上,只需運行.OrderBy(x => x.SortOrder),或者你至少可以移動邏輯淡出人們的視線:

public static class IngredientExtensions 
{ 
    public static int GetSortNumber(this Ingredient item) { 
     return item.Name == "Protein" ? 1 : 
      item.Name == "oil" ? 2 : 
      item.Name == "Fibre" ? 3 : 
      item.Name == "Ash" ? 4 : 
      5; 
    } 
} 

... 

var orderedList = frmltnIngredientsList.OrderBy(item => item.GetSortNumber()); 
+0

嗨大衛,我dint得到這個工作 – sony 2012-02-07 12:15:25

+0

'OrderBy'不這樣工作:它使用惰性執行,所以它不會做任何事情,直到您訪問您的數據。使用'frmltnIngredientsList' ='frmltnIngredientsList.OrderBy(item => item.GetSortNumber())。ToList();'代替。 – ken2k 2012-02-07 12:18:53

+0

啊,是的,我只是想說明如何調用這個方法,但我現在意識到我的代碼似乎意味着該方法會改變源代碼。將進行更新以避免更多混淆。 – 2012-02-07 12:28:01