【问题标题】:Easy way to compare values of more than 3 variables?比较超过 3 个变量的值的简单方法?
【发布时间】:2011-07-08 12:17:06
【问题描述】:

我想检查这些变量是否具有相同的值。

示例:

int a = 5;
int b = 5;
int c = 5;
int d = 5;
int e = 5;
. . .
int k = 5;

if(a==b && b==c && c==d && d==e && .... && j==k)  
{
   //this is Complex way and not well understandable.
}

有什么简单的方法可以比较所有的都相同吗?
喜欢下面的例子

if(a==b==c==d==e.....j==k)
{
    //Understandable but not work 
}

【问题讨论】:

  • 如果 (a + b + c .... + k != 55) ... :)
  • 哦,不! a = 55, b = 0, ..., k = 0 :)
  • @ithcy, 5 只是一个例子,它可能是 2 或 3 或其他值取决于用户。
  • 所以这些不在任何类型的集合中(例如:列表或数组);只是大量的普通变量?

标签: c# comparison


【解决方案1】:

这样的事情怎么样:

if (Array.TrueForAll<int>(new int[] {a, b, c, d, e, f, g, h, i, j, k },
        val => (a == val))) {
    // do something
}

【讨论】:

    【解决方案2】:

    有了这么多变量,将它们移动到数组中是否有意义?

    然后您可以使用诸如myarray.Distinct().Count() == 1;myarray.All(r =&gt; r == 5); 之类的 Linq 表达式来测试它们是否都相等

    【讨论】:

      【解决方案3】:

      您可以创建一个 var args 方法来做到这一点:

      bool intsEqual (params int[] ints) { 
         for (int i = 0; i < ints.Length - 1; i++) {
             if (ints[i] != ints[i+1]) {
                return False;
             }
         }
         return True;
      }
      

      然后将所有整数作为参数调用它:

      if (intsEqual(a, b, c, d, e, f, g, h, i, j, k)) {
          doSomeStuff();
      }
      

      【讨论】:

      • 不应该是 ints.Length 和 i
      • 是的,我几乎从不使用 C#。
      • 第二个是off-by-1错误,和c#无关:)
      • 哈哈,这是真的。我实际上创建了很多这样的方法,主要是为了测试用例中的方便方法。但它总是在 Java 或 Groovy 中,所以我不习惯这种疯狂的 .NET 语法。
      • @Kaleb:疯狂的 .NET 语法?!?想为此吵架吗? :)
      【解决方案4】:

      只是一个想法,但如果你能计算出整个列表的标准差,并且它等于零,你就会得到答案。

      以下是网站上解决此问题的答案,可能对此有所帮助:Standard deviation of generic list?

      有趣的问题。祝你好运。

      【讨论】:

      • 是的,没有什么比增加不足更重要了。
      【解决方案5】:

      我同意最简单的方法是将它们全部放入一个列表中,然后使用以下内容进行比较。这实质上是循环遍历并与第一个值进行比较,但这更简洁一些。

      var match = counts.All(x => x == counts[0])
      

      【讨论】:

        【解决方案6】:

        怎么样

        int common = a;
        if (a==common && b==common  && c==common  && d==common  && .... && k==common)
        

        【讨论】:

          【解决方案7】:

          你可以这样写一个辅助方法:

          public static bool AllEqual<T> (params T[] values) where T : IEquatable<T>
          {
              if (values.Length < 2) return true;
          
              for (int i = 1; i < values.Length; i++)
                  if (!values[i].Equals (values[0])) return false;
          
              return true;    
          }
          

          在特殊情况下,这与 == 运算符略有不同:

          AllEqual (double.NaN, double.NaN).Dump();    // True
          (double.NaN == double.NaN).Dump();           // False
          

          【讨论】:

            【解决方案8】:

            它不起作用,因为 a==b 的计算结果是一个无法与整数 c 比较的布尔值。你所拥有的似乎是最好的方法。

            【讨论】:

            • 我知道,只是举个例子来解释我需要什么。
            【解决方案9】:

            您可以考虑将值放入数组并使用 for() 循环。它实际上并不简单,但如果值的数量发生变化,它可能会有所帮助。

            【讨论】:

              【解决方案10】:

              您可以使用可变参数辅助函数非常轻松地进行比较。

              static bool CompareLongList(params int[] args)
                  {
                      if (args.Length > 1)
                      {
                          int value = args[0];
              
                          for (int i = 1; i < args.Length; ++i)
                          {
                              if (value != args[i])
                                  return false;
                          }
                      }
              
                      return true;
                  }
              

              那么你只需使用如下函数

              if(CompareLongList(a,b,c,d,e,f,j,h,i,j,k))
              {
                 // True Code
              }
              

              【讨论】:

                【解决方案11】:

                我知道这是我遇到的一个老问题,但我想知道有什么问题:

                if (a == (b & c & d & e & f & g & h & i & j & k))
                {
                
                }
                

                【讨论】:

                • 如果您可以检查 a 是否等于所有这些字母的值,则什么都没有。
                • @user3303020,你确定。不会 b & c = 0b0000 吗?我们正在执行 AND 操作,而不是 OR。
                【解决方案12】:

                比较数组中的相同元素:

                same = len(uniq([1,2,3,4])) == 1
                

                【讨论】:

                  【解决方案13】:

                  使用 Linq 查询。 var bestInt = new List() { a,b,c,d,e,f}.Max();

                  【讨论】:

                  • 但他想知道它们是否都一样......不是哪一个是最伟大的
                  【解决方案14】:

                  按位和是检查多个变量是否具有相同值的一种可能方法。 这样的辅助方法当然也可以检查相等性,而不是使用“&”运算符。接受 params 变量数组的辅助方法在这里似乎是正确的方法。我们也可以调整这个方法来接受一个通用参数,但是在 C#(和其他语言)中只有少数数据类型支持布尔逻辑运算符。

                  使用高值 Int32 进行测试以检查其有效性:

                  void Main()
                  {
                      int a = 1234567891;
                      int b = 1234567891;
                      int c = 1234567891; 
                      int d = 1234567891;
                      int e = 1234567891; 
                      int f = 1234567891; 
                      int g = 1234567891; 
                      int h = 1234567891; 
                      int i = 1234567891; 
                      int j = 1234567891;
                      int k = 1234567891; 
                      bool areAllSameValue = IntUtils.AreAllVariablesSameValue(a,b,c,d,e,f,g,h,i,j,k);
                      areAllSameValue.Dump(); //Linqpad method - dump this code into Linqpad to test
                  }
                  
                  public class IntUtils
                  {
                      public static bool AreAllVariablesSameValue(params int[] values)
                      {
                          if (values == null || !values.Any())
                          {
                              return false;
                          }
                          int bitWiseAndValue = values[0];
                          foreach (var value in values)
                          {
                              bitWiseAndValue &= value;
                          }
                          return bitWiseAndValue == values[0];        
                      }
                  }
                  

                  如果其中一个值的符号不同(负数),也会出现这种情况。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-10-09
                    • 1970-01-01
                    • 2013-01-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-21
                    相关资源
                    最近更新 更多