#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
.