在C#中,如何使用switch对非常量字符串值进行模式匹配?
In C#, How To Perform Pattern Matching With Switch For Non-Constant String Value?
在C#中,如何使用switch对非常量字符串值进行模式匹配?
我希望能够使用非常量字符串变量作为 switch 语句中的匹配目标。
我有下面的代码,但我在 case expectedValue:
遇到错误 CS0150: A constant value is expected
public bool UseStandardSwitch(string inputValue)
{
var expectedValue = "SomeValue";
bool result = default;
var DoSomething = () => { result = true; };
switch (inputValue)
{
case expectedValue:
DoSomething();
break;
default:
break;
}
return result;
}
有没有办法达到类似的效果?
您可以使用 the var pattern 来完成类似的事情。
试试这个:
public bool UsePatternMatching(string value)
{
var DoSomething = () => true;
return value switch
{
var str when str.Equals("SomeValue") => DoSomething(),
_ => throw new ArgumentException(),
};
}
更新:请参阅 Stron 的 post 以获得改进的答案。
无需引入变量(如您的回答)- 您可以将 discard 与 case guard 一起使用:
public bool UseStandardSwitch(string inputValue)
{
var expectedValue = Console.ReadLine()!;
Func<bool> DoSomething = () => true;
return inputValue switch
{
_ when inputValue.Equals(expectedValue) => DoSomething(),
_ when inputValue.Equals(expectedValue + "1") => DoSomething(),
_ => throw new ArgumentException(),
};
}
在C#中,如何使用switch对非常量字符串值进行模式匹配?
我希望能够使用非常量字符串变量作为 switch 语句中的匹配目标。
我有下面的代码,但我在 case expectedValue:
CS0150: A constant value is expected
public bool UseStandardSwitch(string inputValue)
{
var expectedValue = "SomeValue";
bool result = default;
var DoSomething = () => { result = true; };
switch (inputValue)
{
case expectedValue:
DoSomething();
break;
default:
break;
}
return result;
}
有没有办法达到类似的效果?
您可以使用 the var pattern 来完成类似的事情。
试试这个:
public bool UsePatternMatching(string value)
{
var DoSomething = () => true;
return value switch
{
var str when str.Equals("SomeValue") => DoSomething(),
_ => throw new ArgumentException(),
};
}
更新:请参阅 Stron 的 post 以获得改进的答案。
无需引入变量(如您的回答)- 您可以将 discard 与 case guard 一起使用:
public bool UseStandardSwitch(string inputValue)
{
var expectedValue = Console.ReadLine()!;
Func<bool> DoSomething = () => true;
return inputValue switch
{
_ when inputValue.Equals(expectedValue) => DoSomething(),
_ when inputValue.Equals(expectedValue + "1") => DoSomething(),
_ => throw new ArgumentException(),
};
}