用于检查具有多个值的相等性的语法糖

时间:2015-11-16 18:03:52

标签: c# .net equality

我想compare 2 equations,让我们2*2 and 2+2使用Visual Studio 2015,例如4,例如if (4 == (2*2 && 2+2)) {...}

if (4 == 2*2 && 4 == 2+2) {...}

但它会返回错误,“运营商”&&&不能应用于'int'和'int'类型的操作数。我能想到编写代码的唯一方法是:

{{1}}

哪个会起作用,但是当要比较很多值时会非常重复。有没有更简单的方法来实现这一目标?

6 个答案:

答案 0 :(得分:11)

var results = new[]{ 2 + 2, 2 * 2, ... };
if (results.All(r => r == 4)) {
    ...
}

这会收集集合results中所有操作的结果,并使用扩展方法All来验证指定的谓词是否适用于所有值;允许只写一次谓词。

答案 1 :(得分:5)

你可以写一个函数:

public static bool AllEqual<T>(T expectedResult, params T[] calculations)
    where T : IEquatable<T>
{
    return calculations.All(x => x.Equals(expectedResult));
}

例如:

if (AllEqual(4, 2 + 2, 2 * 2, 1 + 1 + 1 + 1)) {
    // true
}

if (AllEqual(4, 2 + 2, 2 * 3)) {
    // not true
}

这甚至适用于其他类型,例如

if (AllEqual("foo", "f" + "o" + "o", "fooo".Substring(0, 3))) {
    // true
}

答案 2 :(得分:2)

如果你想减少重复,Linq查询效果很好:

IEnumerable<int> fourExpressions = new List<int>{ 2 + 2, 2 * 2, ... };
bool allEqualToFour = fourExpressions.All(x => x == 4);
if (allEqualToFour) { ... }

或作为一行

if (new int[]{ 2 + 2, 2 * 2 }.All(x => x == 4)) { ... }

或(ab)使用扩展方法获得最大的简洁性。 (通常,使用像这样的辅助方法污染所有对象不是最好的主意,因此这种方法很可能留作静态方法。)

public static class QuestionableExtensions
{
    public static bool EqualsAllOf<T>(this T value, params T[] collection) where T : IEquatable<T>
    {
        return collection.All(t => value.Equals(t));
    }
}

public class MyClass 
{
    public void MyMethod()
    {
        if (4.EqualsAllOf(2 * 2, 2 + 2)) { ... }
    }
}

以下page有很多解释Linq查询的链接。

答案 3 :(得分:1)

您可以使用此扩展方法

var i = 0;
while (i < 10) {
    i++;
    var driver = new webdriver.Builder()
            .forBrowser('firefox')
            .build();

    // login and upload files......
}

答案 4 :(得分:1)

参考@ walpen的回答指出AllLinq扩展名(在System.Linq.Enumerable中定义)。

我想提供All的.NET 2.0实现,作为扩展。

首先,我们将定义一个名为Attribute的{​​{1}}。 (参考文献:Using extension methods in .NET 2.0?

ExtensionAttribute

然后,(通过魔术)我们可以使用namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] public sealed class ExtensionAttribute : Attribute { } } 引用来扩展。因此,我们将为this的使用创建static class:我选择通过在{{1}中定义名为可枚举ExtensionAttribute来实现此目的} namespace。

static class

然后,使用它就很简单了。

System.Collections.Generic

答案 5 :(得分:-1)

只是在那里抛出一个随意的想法

if (new Int32[] { 2 * 2, 2 + 2, ... }.All(t => t == 4))
{
    MessageBox.Show("Yup");
}
else
{
    MessageBox.Show("Nope");
}

抱歉,抱歉,我误解了我删除了以前的代码。这执行了OP的逻辑。

All是我能找到的唯一方法。