2011-04-15 2 views
0

У меня есть программа, которая имеет следующий код:Сделать этот фрагмент кода лучше

foreach (string section in DataAccessLayer.AcceptedSections) 
{ 
    switch (section) 
    { 
     case "Section1": 
      Console.WriteLine("Section 1"); 
      break; 
     case "Section2": 
      Console.WriteLine("Section 2"); 
      break; 
     case "Section3": 
      Console.WriteLine("Section 3"); 
      break; 
     default: 
      Console.WriteLine("Default section"); 
      break; 
    }      
} 

есть в любом случае я могу делать то, что делает этот код без предоставления строки в секции снова в случае? DataAccessLayer.AcceptedSections является динамическим, и я не хочу, чтобы я добавлял другой раздел в свой код, перестраивал и передислоцировал каждый раз, когда на него выходит новый раздел. Это пятница, и мой ум работает не очень хорошо.

Для примера: Я не хочу, чтобы добавить следующий код, когда Раздел 4 добавляется в базу данных:

case "Section4": 
    Console.WriteLine("Section 4"); 
    break; 
+0

, что делает ваш 'Accepte Таблица dSections выглядит? – hunter

+0

Принадлежит CodeReview.StackExchange.Com –

+0

Все они были отличные ответы, я +1 на все ответы, но для моего случая словарь работал лучше всего, потому что я могу прикрепить метод, который я хочу выполнить на нем. – capdragon

ответ

3

есть Dictionary<string,Action<T>> что заклиненный на section. Это полностью заменит оператор switch.

Вызывает соответствующее действие:

foreach (string section in DataAccessLayer.AcceptedSections) 
{ 
    myActionsDictionary[section](); 
} 
+0

@Downvoter - прокомментировать? – Oded

+0

действительно? вниз? Это неплохой вариант, хотя он не динамический. +1 – hunter

+1

a) Я не сторонник. б) Однако, похоже, это еще не похоже на проблему, как раньше? Вам все равно нужно будет увидеть, что «Раздел 4» и соответствующее действие были зарегистрированы в словаре. –

5

Если строка всегда «SectionN», вы могли бы просто справиться с этим непосредственно:

if (section.StartsWith("Section")) 
    Console.WriteLine(section.Insert(7, " ")); 
else 
    Console.WriteLine("Default Section"); 
+0

+1 для StartsWith/Insert. Я всегда что-то изучаю в StackOverflow: D – ray

1

Если это все управляемые данными я предлагаю вам просто вернуть некоторое другое отображаемое значение из базы данных вместе с этой строкой идентификатора

Таблица AcceptedSections

Name = "Section1" 
DisplayName = "Section 1" 

Тогда вы можете просто вернуть DisplayName


Если нет, то вам придется справиться с этим, как вы делаете сейчас, или вы можете создать перечисление с атрибутом для отображения:

public enum AcceptedSections 
{ 
    [Description("Default Section")] 
    Default, 
    [Description("Section 1")] 
    Section1, 
    [Description("Section 2")] 
    Section2, 
    [Description("Section 3")] 
    Section3, 
    [Description("Section 4")] 
    Section4 
} 
// writing this made me kind woozy... what a terrible enum 

, который позволит вам написать что-то вроде это:

foreach (AcceptedSections section in AcceptedSections.GetValues()) 
{ 
    Console.WriteLine(section.GetDescription()); 
} 

где GetDescription() простой метод, который возвращает этот пользовательский атрибут на перечисление

+0

У меня был голос, и теперь он ушел ... такова жизнь – hunter

+0

Ты меня до меня редактировал. Первый подход к управлению данными обеспечивает максимальную гибкость для изменения отображаемого значения без необходимости влиять на код (при отсутствии первоначального изменения для включения дополнительного поля).Однако добавление перечисления в очередной раз представляет ту же задачу, которую он пытается избежать: обновление кода каждый раз, когда раздел добавляется в базу данных. –

+0

@ Энтони да, просто представляя немного более управляемый вариант. Управление перечислением лучше, чем управление этим оператором switch IMHO. Но да, предпочтительный вариант с данными. – hunter

Смежные вопросы