2012-02-07 76 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