Как мне выполнить проверку с более чем 1000 операторами if?

#c# #.net #if-statement

#c# #.net #if-statement

Вопрос:

У меня есть список газет и журналов. Если быть точным, он равен 1374, и все мои файлы называются так, abcd_20190406.xml где abcd — сокращение имени файла, а 20190406 — дата в yyyyMMdd формате.

Итак, я хочу, чтобы, если я нажму кнопку в моей WindowsForm, она выполняла поиск abcd в списке. Если найдено, оно заполнит соответствующие данные, которые будут указаны в моей форме TextBoxes .

 if (Path.GetFileNameWithoutExtension(cboSource.Text).StartsWith("aamfr"))
{
        TextBoxPublication.Text = "Anti-âge Magazine";
        TextBoxAbbreviation.Text = "aamfr";
        TextBoxLanguage.Text="fr";
}

if (Path.GetFileNameWithoutExtension(cboSource.Text).StartsWith("wic"))
{
        TextBoxPublication.Text = "Wisden Cricket Monthly";
        TextBoxAbbreviation.Text = "wic";
        TextBoxLanguage.Text="en";
}
  

И так далее. Это мой текущий подход. Предоставление 1374 условий if. Итак, есть ли более быстрый или более эффективный способ сделать это?

Я думал о создании List<string> и выполнении этого, но я понятия не имею, как поступить. Я даже не знаю, правильный ли это способ сделать это.

Пожалуйста, помогите.

Комментарии:

1. Используйте список, содержащий данные для публикации, сокращения и языка

2. Я предполагаю, что у вас есть какой-то источник для текста, аббревиатуры и языка, а не вводить его из собственных знаний, поэтому обработайте этот источник для генерации данных и сохраните его в таблице внутри базы данных или коллекции, а не писать 1734 * 3 записи самостоятельно.

Ответ №1:

Создайте класс для хранения информации для каждой публикации, например:

 class PublicationInfo
{
    public string Title{ get; set; }
    public string Abbreviation{ get; set; }
    public string Language{ get; set; }
}
  

Затем используйте словарь для хранения всех ваших публикаций

 var Publications = new Dictionary<string,PublicationInfo>();
  

и заполните его своими данными, используя аббревиатуру в качестве ключа.
Затем вы сможете заполнить свои текстовые поля следующим образом:

 var abbreviation = Path.GetFileNameWithoutExtension(cboSource.Text).Split("_")[0];
if (Publications.ContainsKey(abbreviation)
{
    TextBoxPublication.Text = Publications[abbreviation].Title;
    TextBoxAbbreviation.Text = abbreviation;
    TextBoxLanguage.Text = Publications[abbreviation].Language;
}
  

Ответ №2:

Инкапсулируйте логику в классе, что упрощает поддержку вашего кода. Когда вы решаете добавить или удалить журналы, вам не нужно изменять свой код по принципу открытия-закрытия класса, не так ли?

 public class Magazine
{
    public string Publication { get; set; }

    public string Abbreviation { get; set; }

    public string Language { get; set; }

    public Func<string, bool> Predicate { get; set; }
} 

private List<Magazine> _magazines = new List List<Magazine>
{
    new Magazine
    {
        Publication = "Anti-âge Magazine",
        Abbreviation = "aamfr",
        Language ="fr",  
        Predicate = source => source.StartsWith("aamfr")       
    }
}
  

Использование

 var magazine = 
    _magazines.Where(mag => mag.Predicate(cboSource.Text))
              .DefaultIfEmpty(new Magazine())
              .First();

TextBoxPublication.Text = magazine.Publication;
TextBoxAbbreviation.Text = magazine.Abbreviation;
TextBoxLanguage.Text= magazine.Language;
  

Функция предиката обеспечит более гибкий подход, при котором каждый журнал может иметь разные предикаты, а не только StartsWith .