我有五个变量:
int a, b, c, d, res;
我想找出a
,b
,c
,d
不是0
的值,并将其分配给res
}。如果所有a
,b
,c
,d
都为零,则res
应为0
。我目前的代码是
res = 0;
if (a != 0)
{
res = a;
}
if (b != 0)
{
res = b;
}
if (c != 0)
{
res = c;
}
if (d != 0)
{
res = d;
}
有没有更合理的方式做同样的事情?
答案 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)
res = a != 0 ? a : b != 0 ? b : c != 0 ? c : d;
答案 4 :(得分:0)
首先,我想指出你的问题没有明确说明,所以我会做一些假设:
a
,b
,c
等都是0
会怎样?我认为这种情况是错误的。好的,现在我们遇到了一个问题,我们可以很容易地进行推广。因为这可以重复使用,我们将实现一个方法,并且我们将使用 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
}