我有这段代码:
if (y == a && y == b && y == c && y == d ...)
{
...
}
是否有某种形式的速记,以便我可以像这样重写它?
if(y == (a && b && c && d ...))
{
...
}
功能应该完全相同。我只是在找一些看起来不那么混乱的东西。
编辑很抱歉没有澄清,所有变量都是整数。我正在寻找一种更短的方法来确保a
,b
,c
,d
,...等于y
。
答案 0 :(得分:9)
你最接近的(没有实现你自己的机制):
if (new[] { a, b, c, d }.All(value => y == value))
// ...
答案 1 :(得分:4)
否,没有什么可以简化您的代码而不会超过可读性带来的性能损失。
修改:高效解决方案
如果你非常渴望尝试高性能的解决方案,那就是:
(更新:显然我认为你可以在varargs中使用泛型;我显然只能对类型进行硬编码。所以我将下面的类型更改为int
,但是相同的代码适用。)
static bool AllEqual(int value, __arglist)
{
for (var ai = new ArgIterator(__arglist); ai.GetRemainingCount() > 0; )
{
var next = __refvalue(ai.GetNextArg(typeof(int).TypeHandle), int);
if (!value.Equals(next)) { return false; }
}
return true;
}
然后尝试用:
调用它//...
bool equal = AllEqual(1, __arglist(1, 1, 1));
警告:人们可能会因为这样做而对你大喊大叫,所以使用它需要你自担风险。 :)
答案 2 :(得分:3)
稍微更具可读性(在我看来)是:
if ((y == a) && (y == b) && (y == c) && (y == d) ...)
但我不相信基础语言中有任何内容。
如果你真的想要像你提出的那样,那就是函数的用途,例如:
if (isSetToAll (y, a, b, c, d, ...))
但您可能需要在性能方面小心。
如果在a/b/c/d/...
不变的循环中(换句话说,只有y
正在发生变化),可能对您有用。< / p>
检查循环外不变量的相等性:
if ((a == b) && (a == c) && (a == d) ...)
因为,如果不是这样,那么y
永远不会等于所有这些。然后,在循环内部,只需执行:
if (y == a)
您已经知道所有非y
变量彼此相等的事实意味着您只需要针对其中一个变量检查y
。
但是,由于我没有看到你的完整代码,我不确定它对你有用。
我应该提一下,虽然详细,但你的原始代码实际上并不可读,特别是如果它的格式很好。甚至是庞然大物:
if ((y == a) && (y == b) && (y == c) && (y == d) &&
(y == e) && (y == f) && (y == g) && (y == h) &&
(y == i) && (y == j) && (y == k) && (y == l) &&
(y == m) && (y == n) && (y == o) && (y == p) &&
(y == q) && (y == r) && (y == s) && (y == t) &&
(y == u) && (y == v) && (y == w) && (y == x))
{
...
}
是可读的(虽然我不是简洁变量名的忠实粉丝)。
当然,在这一点上,你可能想要研究使用带循环而不是奇异变量的数组。
答案 3 :(得分:2)
不,没有。坚持你所拥有的。
好吧,你可以写一个public static bool AllEqual<T>(params T[] values)
(可能有2/3/4/5个操作数的重载以避免数组创建),但我不确定它是否值得大多数时间。
答案 4 :(得分:1)
试试这个:
假设您正在比较字符串
IList<string> valuesToCompare = new List<string> { "a", "b", "c", "d" };
if (valuesToCompare.Any(valueToCompare => valueToCompare != y))
//If there is any value that is not equal to y
//Do something
答案 5 :(得分:0)
new[] { a, b, c, d }.Contains(y)
答案 6 :(得分:0)
虽然无法确定,但我会查看您的整体代码结构,看看是否有更好的方法来处理整个区域。
每当你有一个像那样重复的模式时,你可能需要经常修改它。您可能需要添加新的q == y或最终更改某些内容。
这里的很多人都关心性能,但确保您的代码可维护,易于理解和正确考虑因素更为重要。
总的来说,我要说你的a,b,c,d变量都应该是4个不同对象的成员,a.x,b.x,c.x,d.x。 a,b,c,d代表什么?它们不能只是任意数字,它们是价格或像素位置或元素的权重 - 一些东西!我无法想象你有4个而且从不有5或3个东西的情况。
无论如何,无论它代表什么,都可能还有其他与之相关的东西 - 名称,大小,颜色,控制指数 - 无论如何。
一般情况下,我会考虑更高级别来修复此问题。我要说至少a,b,c&amp; d应该是程序外部定义的东西,无论是在数据文件还是数据库中。
答案 7 :(得分:-1)
对于 if(y == a&amp;&amp; y == b&amp; y == c&amp;&amp; y == d),请使用:
<击> if(y == a == b == c == d) { //代码在这里 } 击>
对于 if(y == a || y == b || y == c || y == d)且y是简单类型或字符串,请使用:
switch(y)
{
case a:
case b:
case c:
case d:
//your code here
break;
}
答案 8 :(得分:-3)
bool x=true ,y=true, z=true, p = true;
if (x == (y == z == p)) //true
x = false;
if (x == (y == z == p)) //false