Используйте string.Contains () с switch () - PullRequest
27 голосов
/ 24 августа 2011

Я создаю приложение на C #, в котором я использую

if ((message.Contains("test")))
{
   Console.WriteLine("yes");
} else if ((message.Contains("test2"))) {
   Console.WriteLine("yes for test2");
}

. Можно ли было бы заменить switch() операторы if()?

Ответы [ 8 ]

34 голосов
/ 24 августа 2011

Нет, для оператора switch требуются постоянные времени компиляции.Оператор message.Contains("test") может оценивать true или false в зависимости от сообщения, поэтому он не является константой, поэтому его нельзя использовать в качестве «регистра» для оператора switch.

27 голосов
/ 24 августа 2011

Если вы просто хотите использовать 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`... 
 }
23 голосов
/ 02 января 2017

Правильный окончательный синтаксис для [Mr.Ответ C].

С выпуском VS2017RC и его поддержкой C # 7 он работает следующим образом:

switch(message)
{
    case string a when a.Contains("test2"): return "no";
    case string b when b.Contains("test"): return "yes";
}

Вы должны позаботиться о порядке дел, так как первое совпадение будетвыбрал.Вот почему «test2» ставится перед тестом.

12 голосов
/ 24 августа 2011

Сначала вы можете выполнить проверку, а затем использовать переключатель по своему усмотрению.

Например:

string str = "parameter"; // test1..test2..test3....

if (!message.Contains(str)) return ;

Затем

switch(str)
{
  case "test1" : {} break;
  case "test2" : {} break;
  default : {} break;
}
4 голосов
/ 15 декабря 2016

Это будет работать в C # 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/

2 голосов
/ 17 мая 2017

Столкнувшись с этой проблемой при определении среды, я придумал следующую однострочную строку:

string ActiveEnvironment = localEnv.Contains("LIVE") ? "LIVE" : (localEnv.Contains("TEST") ? "TEST" : (localEnv.Contains("LOCAL") ? "LOCAL" : null));

Таким образом, если он не может найти что-либо в предоставленной строке, которая соответствует «switch»"условия, он сдается и возвращает null.Это можно легко изменить, чтобы получить другое значение.

Это не строго переключатель, скорее каскадный оператор if, но он аккуратный и сработал.

2 голосов
/ 24 августа 2011

Некоторые пользовательские 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);
0 голосов
/ 08 января 2019
string message = "This is test1";
string[] switchStrings = { "TEST1", "TEST2" };
switch (switchStrings.FirstOrDefault<string>(s => message.ToUpper().Contains(s)))
{
    case "TEST1":
        //Do work
        break;
    case "TEST2":
        //Do work
        break;
    default:
        //Do work
        break; 
}
...