清楚地写if语句的方法

时间:2013-08-13 13:00:34

标签: c#

考虑以下代码:

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#写这个。

编写上述代码的明确方法是什么,知道resultslong[]

9 个答案:

答案 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)

switch (C# Reference)

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是一个整数数组。