Я проверяю имя file и возвращаю TRUE, если оно правильное:
bool name_FORD = file.Contains("FORD");
bool name_KIA = file.Contains("KIA");
bool name_BMW = file.Contains("BMW");
Исходя из этого, я хочу иметь выключатель и работать правильно method. Но я запутался, как правильно это сделать:
switch (true)
{
case 1 name_FORD:
method1();
break();
case 2 name_KIA:
method2();
break();
case 3 name_BMW:
method3();
break();
}
Используйте вложенный, если еще...
Вам не понадобится switch, а всего несколько if-тычинок: if (name_FORD) { method1; }.
возможный дубликат stackoverflow.com/questions/7175580/…
Я боюсь, что если вы не используете С# 7.0, это будет невозможно в простом переключателе/кейсе. devblogs.microsoft.com/dotnet/whats-new-in-csharp-7-0





Я предлагаю организация все строки и соответствующие методы как Dictionary:
Dictionary<string, Action> myCars = new Dictionary<string, Action>() {
{"FORD", method1}, // e.g. {"FORD", () => {Console.WriteLine("It's Ford!");}},
{ "KIA", method2},
{ "BMW", method3},
//TODO: Put all the cars here
};
тогда мы можем поставить простой цикл:
foreach (var pair in myCars)
if (file.Contains(pair.Key)) { // if file contains pair.Key
pair.Value(); // we execute corresponding method pair.Value
break;
}
Редактировать: В случае, если у нас могут быть сложные методы (например, методу могут потребоваться параметры file и key), мы можем изменить подпись:
// Each action can have 2 parameters: key (e.g. "FORD") and file
Dictionary<string, Action<string, string>> myCars =
new Dictionary<string, Action<string, string>>() {
{"FORD", (key, file) => {Console.Write($"{key} : {string.Concat(file.Take(100))}")}},
{ "KIA", (key, file) => {Console.Write($"It's {key}!")}},
{ "BMW", (key, file) => {/* Do nothing */}},
//TODO: Put all the cars here
};
При выполнении в цикле мы должны предоставить следующие параметры:
foreach (var pair in myCars)
if (file.Contains(pair.Key)) { // if file contains pair.Key
pair.Value(pair.Key, file); // we execute corresponding method pair.Value
break;
}
где будет выполняться метод??
@4est: pair.Value(); мы получаем pair.Value то есть Action и выполняем его - ()
Я сделал простой метод для тестирования: private void method1() => Console.WriteLine("test"); но это не работает
Давайте проверим: {"FORD", () => {Console.WriteLine("test");}}, ...
привет, @ Дмитрий, еще один: я получил сложный метод и получил это: Аргумент2: невозможно преобразовать группу "метод" в "Действие"
Попробуйте упаковка метод в Action, например. {"FORD", () => {myComplexMethod(argument1, argument2, argument3);}}, здесь мы можем назвать все, что нам нравится внутри {...}. Если вы хотите перейти file к действию, объявите его как Dictionary<string, Action<string>> myCars = new Dictionary<string, Action<string>>() и позвоните pair.Value(file);
Давайте продолжить обсуждение в чате.
Вы можете использовать такие методы, как переменные в С#, назначив их действию:
public void KiaMethod(){
Console.WriteLine("Kia");
}
public void BmwMethod(){
Console.WriteLine("BMW");
}
Action method = null;
if (file.Contains("KIA"))
method = KiaMethod;
else if (file.Contains("BMW"))
method = BmwMethod;
method();
Хотя я действительно поддерживаю шаблон в ответе Кейрана, потому что я действительно не понимаю, зачем вам нужен этот уровень сложности.
А что, если файл содержит все три из них?