Как выполнить проверку с помощью более 1000 операторов if? - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть список газет и журналов. Точнее, до 1374, и все мои файлы названы как abcd_20190406.xml, где abcd - это имя файла abbreviaton, а 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 если условия. Так есть ли более быстрый или лучший способ сделать это?

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

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

Ответы [ 2 ]

6 голосов
/ 07 апреля 2019

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

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;
}
4 голосов
/ 07 апреля 2019

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...