3

我有这个代码:

    if (y == a && y == b && y == c && y == d ...)
    {
        ...
    }

是否有某种形式的速记,以便我可以将其重写为这样的东西?

    if(y == (a && b && c && d ...))
    {
        ...
    }

功能应该完全相同。我只是在寻找看起来不那么令人困惑的东西。

编辑抱歉没有澄清,所有变量都是整数。我正在寻找一种更短的方法来确保 , a, b, c, d... 都相等y

4

9 回答 9

10

您将获得的最接近的(不实施您自己的机制):

if (new[] { a, b, c, d }.All(value => y == value))
    // ...
于 2011-01-18T00:02:21.233 回答
4

,没有任何东西可以简化您的代码,而不会超过可读性的好处和巨大的性能损失。


编辑:高性能解决方案

如果您迫切需要尝试高性能解决方案,这里有一个:

(更新:显然我认为可以将泛型与可变参数一起使用是错误的;您显然只能对类型进行硬编码。所以我将下面的类型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));

警告:人们可能会因为你这样做而对你大喊大叫,所以使用它需要你自担风险。:)

于 2011-01-18T00:02:02.827 回答
3

更具可读性(在我看来)是:

if ((y == a) && (y == b) && (y == c) && (y == d) ...)

但我不相信基础语言中有任何内容。

如果你真的想要你提议的东西,那就是函数的用途,比如:

if (isSetToAll (y, a, b, c, d, ...))

但您可能需要在性能方面小心。


如果这是在一个不变的循环中完成的(换句话说,只有在哪里发生变化) ,那么一件事可能对您有用。a/b/c/d/...y

检查循环外不变量的相等性:

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))
{
    ...
}

是可读的(虽然我不是简洁的变量名的忠实粉丝)。

当然,此时,您可能希望考虑使用带有循环的数组而不是奇异变量。

于 2011-01-18T00:05:01.683 回答
2

不,没有。坚持你所拥有的。

好吧,您可以编写一个public static bool AllEqual<T>(params T[] values)(可能对 2/3/4/5 操作数进行重载以避免创建数组),但我不确定它在大多数情况下是否值得。

于 2011-01-18T00:03:36.710 回答
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
于 2011-01-18T00:04:05.290 回答
0
new[] { a, b, c, d }.Contains(y)
于 2011-01-18T00:00:54.380 回答
0

尽管无法确定,但我会查看您的整体代码结构,看看是否有更好的方法来处理整个区域。

任何时候你有一个像这样重复的模式,你可能需要对它进行大量修改。您可能需要添加新的 q==y 或最终更改某些内容。

这里的很多人都关心性能,但更重要的是确保你的代码是可维护的、可理解的和适当的因素。

作为一个总的猜测,我会说你的 a、b、c、d 变量都应该是 4 个不同对象的成员, ax、bx、cx、dx a、b、c、d 代表什么?它们不能只是任意数字,它们是价格或像素位置或元素的权重——一些东西!我无法想象你会有 4 个而不是 5 个或 3 个的情况。

不管怎样,不管它代表什么,可能还有其他与之相关的东西——名称、大小、颜色、控制索引——随便什么。

一般来说,我会寻找更高级别的解决方案来解决这个问题。我想说至少 a,b,c & d 应该是在程序之外定义的东西,无论是在数据文件还是数据库中。

于 2011-01-18T00:41:03.027 回答
-1

对于if (y == a && y == b && y == c && y == d),使用:

if ( y == a == b == c == d) { //代码在这里 }

如果 (y == a || y == b || y == c || y == d)并且 y 是简单类型或字符串,请使用:

switch(y)
{
   case a:
   case b:
   case c:
   case d:
     //your code here
     break;

}
于 2011-01-18T00:01:01.173 回答
-3
   bool  x=true ,y=true, z=true, p = true;

    if (x == (y == z == p)) //true

    x = false;
    if (x == (y == z == p)) //false
于 2011-01-18T00:10:14.597 回答