C#比较速记

我有这个代码:

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

是否有某种forms的速记,以便我可以像这样重写它?

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

function应该完全相同。 我只是在找一些看起来不那么混乱的东西。

编辑很抱歉没有澄清,所有变量都是整数。 我正在寻找一种更短的方法来确保abcd ,……都等于y

你最接近的(没有实现你自己的机制):

 if (new[] { a, b, c, d }.All(value => y == value)) // ... 

,没有什么可以简化您的代码而不会超过可读性优势而导致性能损失很大。


编辑: 高性能解决方案

如果你非常渴望尝试高性能的解决方案,那么这里有一个:

(更新:显然我认为你可以在varargs中使用generics;我显然只能对类型进行硬编码。所以我将下面的类型更改为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)); 

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

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

 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变量彼此相等的事实意味着您只需要对其中一个变量进行检查。

但是,由于我没有看到您的完整代码,我不确定它是否对您有用。


我应该提一下,虽然详细,但你的原始代码实际上并不可读,特别是如果它的格式很好。 即使是庞然大物:

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

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

当然,在这一点上,您可能希望研究使用带循环的数组而不是奇异变量。

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

好吧,你可以写一个public static bool AllEqual(params T[] values) (可能有2/3/4/5操作数的重载以避免数组创建),但我不确定它是否值得大部分时间。

试试这个:

假设你正在比较字符串

 IList valuesToCompare = new List { "a", "b", "c", "d" }; if (valuesToCompare.Any(valueToCompare => valueToCompare != y)) //If there is any value that is not equal to y //Do something 

虽然不可能确定,但​​我会查看您的整体代码结构,看看是否有更好的方法来处理整个区域。

每当你有一个像那样重复的模式时,你可能需要对它进行很多修改。 您可能需要添加新的q == y或最终更改某些内容。

这里有很多人关注性能,但确保代码可维护,易懂和适当考虑因素更为重要。

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

无论如何,无论它代表什么,可能还有其他与之相关的东西 – 名称,大小,颜色,控制指数 – 无论如何。

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

 new[] { a, b, c, d }.Contains(y) 

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

if(y == a == b == c == d){// code here}

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

 switch(y) { case a: case b: case c: case d: //your code here break; } 
  bool x=true ,y=true, z=true, p = true; if (x == (y == z == p)) //true x = false; if (x == (y == z == p)) //false