2

我正在创建一个根据用户定义的设置处理数据的程序。在处理过程中,我有几个相关的列表必须根据这些用户自定义的设置进行迭代;用户决定迭代这些列表的顺序。

我想知道如何设计一种算法来迭代这些列表,同时仍然具有非常可维护的代码。这里的想法不是最终得到一个具有巨大 switch-case 的函数,其中每个 case 都对其中一个列表进行迭代。

示例:
假设我需要处理的数据是不同类型食物的列表。用户必须指定处理不同食物组的顺序。食物组只是存储杂项食物的列表:

List<string> grains = new List<string> { "Bread", "Pasta", "Cereal", "Rice" };
List<string> vegetables = new List<string> { "Corn", "Pea", "Carrot", "Tomato" };
List<string> fruits = new List<string> { "Apple", "Orange", "Banana", "Pear" };
List<string> meat = new List<string> { "Beef", "Chicken", "Pork", "Turkey" };
List<string> diary = new List<string> { "Milk", "Cheese", "Yogurt", "Cream" };

用户想要的顺序存储在另一个列表中。下面描述了一种可能的顺序:

List<string> order = new List<string> 
{ 
    "grains",      //Grains processed first.
    "vegetables", 
    "fruits", 
    "meat", 
    "diary"        //Dairy processed last.
};

为了解释它是如何工作的,我将使用不需要的 switch-case:

foreach(string foodGroup in order)
{
    switch(foodGroup)
    {
        case "grains":
            foreach(string foodItem in grains)
            {
                ProcessFood(foodItem);
            }
            break;
        case "vegetables":
            foreach(string foodItem in vegetables)
            {
                ProcessFood(foodItem);
            }
            break;
        case "fruits":
            foreach(string foodItem in fruits)
            {
                ProcessFood(foodItem);
            }
            break;
        case "meat":
            foreach(string foodItem in meat)
            {
                ProcessFood(foodItem);
            }
            break;
        case "diary":
            foreach(string foodItem in diary)
            {
                ProcessFood(foodItem);
            }
            break;
    }
}

在我的应用程序中,case 语句实际上将包含比示例中简单的 foreach 循环更多的代码。有没有更好的方法来设计这个算法?虽然没有必要,但我想知道是否还有一种可扩展的方式来设计这样的算法(添加/删除新的食物组不会破坏算法)。

4

1 回答 1

2

使它成为一本字典:

Dictionary<string, List<string>> lists = new Dictionary<string, List<string>>();
lists["grains"] = new List<string> { "Bread", "Pasta", "Cereal", "Rice" };
lists["vegetables"] = new List<string> { "Corn", "Pea", "Carrot", "Tomato" };
lists["fruits"] = new List<string> { "Apple", "Orange", "Banana", "Pear" };
lists["meat"] = new List<string> { "Beef", "Chicken", "Pork", "Turkey" };
lists["diary"] = new List<string> { "Milk", "Cheese", "Yogurt", "Cream" };

现在你可以这样做:

foreach(string foodGroup in order)
{
   foreach(string foodItem in lists[foodGroup])
   {
      ProcessFood(foodItem);
   }
}

实际上,C# 中也有一些更好的初始化语法。请参阅:http: //msdn.microsoft.com/en-us/library/bb531208.aspx

于 2014-08-27T20:23:51.430 回答