考虑以下代码:
if (results.Contains(14))
{
//anything
}
else if (results.Contains(15))
{
//anything
}
else if (results.Contains(16))
{
//anything
}
我想用switch case编写这段代码:
switch (results)
{
case results.Contains(14):
}
但是我们不能用C#写这个。
编写上述代码的明确方法是什么,知道results
是long[]
?
答案 0 :(得分:8)
这有什么不对:
if (results.Contains(14) || results.Contains(15) || results.Contains(16))
{
new Exception("anything");
}
答案 1 :(得分:4)
因为它可能是一个字符串中的第一个解决方案是使用正则表达式。
var m = System.Text.RegularExpressions.Regex.Matches(results, @"\d{1,2}")[0];
throw new Exception(m);
(注意:我在记事本中这样做,所以可能需要一些小调整)
您可能必须使用匹配语法,因为这仅适用于1-2个数字。在一个字符串中。
答案 2 :(得分:4)
你真的想做什么?
以下情况应该有效,但我不确定这是不是你的想法:
int[] values = {14, 15, 16};
foreach (var n in values) {
if(result.Contains(n))
throw new Exception(n.ToString())
}
- 编辑:问题发生了很大变化,所以这是一个更新 -
我可能会使用普通if-else
,但如果你有很多选项或复杂的逻辑(例如不只是results.Contains()
),有时最好选择表格:
int[] results = {13, 14, 15};
action_map = new Dictionary<int, Action>();
action_map[14] = () => Console.Out.WriteLine("14");
action_map[15] = () => Console.Out.WriteLine("15");
action_map[16] = () => { throw new InvalidOperationException(); };
action_map[0] = () => {}; // NOP, default case - executed if no match found
var action_key = dict.Keys.FirstOrDefault(k => results.Contains(k));
action_map[action_key]();
在实际代码中,我可能会把它包装成一个类:
var table = new FnTable();
table.Add(14, () => Console.Out.WriteLine("14"));
table.Add(15, () => Console.Out.WriteLine("15"));
table.Add(16, () => { throw new InvalidOperationException(); });
int[] results = {13, 14, 15};
table.ExecuteFirstFrom(results);
答案 3 :(得分:3)
我喜欢使用动作词典
var swticher = new Dictionary<long, Func<Exception>>()
{
{15,()=>new Exception("15")},
{14,()=>new Exception("14")}
};
throw swticher[14].Invoke();
当然,更复杂的例子将展示这种方法的力量:)
为什么要使用词典而不是开关:https://stackoverflow.com/a/11617459/1714342
摘要:
简短的回答是switch语句线性执行,而 字典以对数方式执行。
答案 4 :(得分:3)
通常以清除方式替换if / switch语句是否使用多态。但是,在示例中,您提供的if语句非常简单,可以用计算异常内容的简单算法替换它们,如Robert Snyder的回答所述。
答案 5 :(得分:2)
Each case label specifies a constant value.
在您预期的示例代码中,results.Contains(14)
不是常量值,因此语法无效。
答案 6 :(得分:2)
您可以在switch
:
foreach
声明
long[] results = new long[] { 15, 14, 16 };
foreach (long v in results)
{
switch (v)
{
case 14:
// anything
break;
case 15:
// anything
break;
case 16:
// anything
break;
}
}
为了更好地与您的问题相匹配,您应该首先订购数组并在比赛结束后退出比赛:
long[] results = new long[] { 15, 14, 16 };
Array.Sort(results);
foreach (long v in results)
{
switch (v)
{
case 14:
// anything
break;
case 15:
// anything
break;
case 16:
// anything
break;
default:
continue; // continue the foreach loop
}
break; // break the foreach loop because we had a valid match
}
答案 7 :(得分:2)
我实际上不建议这样做,但如果你真的进入switch语句......
long? CheckSpecialNumbers(long[] res)
{
var specialNumbers = new List<long>() {14, 15, 16};
var inters= specialNumbers.Intersect(res);
return inters.Count() > 0 ? (long?)inters.First() : null;
}
然后你可以这样做:
long? res = CheckSpecialNumbers(results);
switch (res)
{
case 14:
Console.WriteLine(14);
break;
case 15:
Console.WriteLine(15);
break;
case 16:
Console.WriteLine(16);
break;
}
答案 8 :(得分:1)
我想用开关案例
编写这段代码
switch
- case
语句用于根据给定变量的值分支执行路径。 OP希望根据布尔表达式的值进行分支,具体来说,是Contains
的返回值。这只能使用if
- else
语句来完成。写switch (results)
没有意义,因为results
是一个整数数组。