Используйте string.Contains() с ключом()
Я делаю приложение С#, где я использую
if ((message.Contains("test")))
{
Console.WriteLine("yes");
} else if ((message.Contains("test2"))) {
Console.WriteLine("yes for test2");
}
Можно ли каким-либо образом изменить на switch()
операторы if()
?
Ответы
Ответ 1
Сначала вы можете выполнить проверку, а затем использовать переключатель, как вам нравится.
Например:
string str = "parameter"; // test1..test2..test3....
if (!message.Contains(str)) return ;
Тогда
switch(str)
{
case "test1" : {} break;
case "test2" : {} break;
default : {} break;
}
Ответ 2
Нет, оператор switch требует констант времени компиляции. Оператор message.Contains("test")
может оценивать true или false в зависимости от сообщения, поэтому он не является константой, поэтому не может использоваться как "случай" для оператора switch.
Ответ 3
Если вы просто хотите использовать switch/case
, вы можете сделать что-то вроде этого, псевдокод:
string message = "test of mine";
string[] keys = new string[] {"test2", "test" };
string sKeyResult = keys.FirstOrDefault<string>(s=>message.Contains(s));
switch (sKeyResult)
{
case "test":
Console.WriteLine("yes for test");
break;
case "test2":
Console.WriteLine("yes for test2");
break;
}
Но если количество ключей велико, вы можете просто заменить его на словарь, например:
static Dictionary<string, string> dict = new Dictionary<string, string>();
static void Main(string[] args)
{
string message = "test of mine";
// this happens only once, during initialization, this is just sample code
dict.Add("test", "yes");
dict.Add("test2", "yes2");
string sKeyResult = dict.Keys.FirstOrDefault<string>(s=>message.Contains(s));
Console.WriteLine(dict[sKeyResult]); //or `TryGetValue`...
}
Ответ 4
Правильный окончательный синтаксис для [Mr. C].
С выпуском VS2017RC и его поддержки С# 7 он работает следующим образом:
switch(message)
{
case string a when a.Contains("test2"): return "no";
case string b when b.Contains("test"): return "yes";
}
Вы должны позаботиться о заказе корпуса, когда будет выбран первый матч. Поэтому перед тестированием помещается "test2".
Ответ 5
Это будет работать на С# 7. На момент написания этой статьи он еще не выпущен. Но , если я это правильно понимаю, этот код будет работать.
switch(message)
{
case Contains("test"):
Console.WriteLine("yes");
break;
case Contains("test2"):
Console.WriteLine("yes for test2");
break;
default:
Console.WriteLine("No matches found!");
}
Источник: https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
Ответ 6
Некоторые пользовательские swtich могут быть созданы следующим образом. Позволяет также выполнить несколько случаев
public class ContainsSwitch
{
List<ContainsSwitch> actionList = new List<ContainsSwitch>();
public string Value { get; set; }
public Action Action { get; set; }
public bool SingleCaseExecution { get; set; }
public void Perform( string target)
{
foreach (ContainsSwitch act in actionList)
{
if (target.Contains(act.Value))
{
act.Action();
if(SingleCaseExecution)
break;
}
}
}
public void AddCase(string value, Action act)
{
actionList.Add(new ContainsSwitch() { Action = act, Value = value });
}
}
Назовите это
string m = "abc";
ContainsSwitch switchAction = new ContainsSwitch();
switchAction.SingleCaseExecution = true;
switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); });
switchAction.AddCase("d", delegate() { Console.WriteLine("matched d"); });
switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); });
switchAction.Perform(m);
Ответ 7
Столкнувшись с этой проблемой при определении среды, я придумал следующий однострочный шрифт:
string ActiveEnvironment = localEnv.Contains("LIVE") ? "LIVE" : (localEnv.Contains("TEST") ? "TEST" : (localEnv.Contains("LOCAL") ? "LOCAL" : null));
Таким образом, если он не может найти ничего в предоставленной строке, которая соответствует условиям "switch", она отказывается и возвращает null
. Это может быть легко изменено, чтобы вернуть другое значение.
Это не строго переключатель, более каскадный оператор if, но он аккуратный и он работал.