逻辑实施问题

时间:2017-12-26 10:35:11

标签: c#

我有五个变量:

int a, b, c, d, res;

我想找出abcd不是0的值,并将其分配给res }。如果所有abcd都为零,则res应为0。我目前的代码是

res = 0;

if (a != 0)
{ 
    res = a;
}
if (b != 0)
{ 
    res = b;
}
if (c != 0)
{ 
    res = c;
}
if (d != 0)
{ 
    res = d;
}

有没有更合理的方式做同样的事情?

5 个答案:

答案 0 :(得分:2)

我建议将a .. d组织到集合中,然后在Linq的帮助下查询该集合:

res = new [] {d, c, b, a}.FirstOrDefault(item => item != 0);

请注意颠倒顺序,因为您当前的代码会重写之前指定的值

if (d != 0)
{ 
    res = d; // <- this will re-assign the res value
}

LastOrDefault是替代方案:

res = new [] {a, b, c, d}.LastOrDefault(item => item != 0); 

答案 1 :(得分:1)

如果没有过度复杂的事情,您可以将else if链接到第一个之上,依此类推。只要其中一个if语句的计算结果为 true ,就可以防止不必要的检查。

if(a != 0)
{ 
   res = a    
}
else if(b != 0)
{ 
   res = b
}
else if(c != 0)
{ 
   res = c
}
else if(d != 0)
{ 
    res = d
}

答案 2 :(得分:1)

int a = 0, b = 0, c = 0, d = 5, res = 0;
res = new[] { a, b, c, d }.Where(x => x != 0).Max();

答案 3 :(得分:0)

ternary operator

怎么样?
res = a != 0 ? a : b != 0 ? b : c != 0 ? c : d;

答案 4 :(得分:0)

首先,我想指出你的问题没有明确说明,所以我会做一些假设:

  1. 如果所有变量abc等都是0会怎样?我认为这种情况是错误的。
  2. 如果一个变量更多是非零,会发生什么?我还假设这种情况是错误的。
  3. 好的,现在我们遇到了一个问题,我们可以很容易地进行推广。因为这可以重复使用,我们将实现一个方法,并且我们将使用 try 方法,这使得使用非常舒适:

    public static bool TryAssignValue<T>(out T value,
                                         Func<T, bool> predicate,
                                         params T[] options)
    

    好的,现在可以使用Enumerable.Single轻松解决此问题,但Try方法不仅要避免向用户投放vexing exceptions,还要避免例外以及它们对性能的影响,所以让我们这样做:

    public static bool TryAssignValue<T>(out T value,
                                         Func<T, bool> predicate,
                                         params T[] options)
    {
        var found = false;
        value = default(T);
    
        foreach (var o in options)
        {
            if (predicate(o))
            {
                if (found)
                {
                    return false;
                }
                else
                {
                    value = o;
                    found = true;
                }
            }
        }
    
        return found;
    }
    

    用法:

    if (!TryAssignValue(out res, i => i != 0, a, b, c, d))
    {
        //failed assignment
    }