2011-11-14 38 views
8

嗨,我说我有三个整数:value1,value2和value3。如何确定三个整数是否相等

如何最好地判断它们是否完全相同?

我想:

return value1 == value2 == value3 

但这说:

操作 '==' 不能应用于类型 '布尔' 和 '廉政' 的操作数。

所以我想它比较前两个返回一个布尔值,它试图比较第三个。

我可以去:

return value1 == value2 && value2 == value3; 

但这似乎变得凌乱。

有人有很好的建议吗?

+1

大多数语言不支持你的第一个语法(唯一的语言,我的通用扩展知道* does *支持该语法是Python)。 – NullUserException

回答

5

第二个对我来说似乎很好。

随着名单变得越来越长,这可能变得笨拙。在这种情况下,我会写一个符合AllSame的扩展方法。

bool AllSame(this IEnumerable<int> list) 
{ 
    bool first = true; 
    int comparand = 0; 
    foreach (int i in list) { 
     if (first) comparand = i; 
     else if (i != comparand) return false; 
     first = false; 
    } 
    return true; 
} 

,或者使用params关键字:

bool AllSame(params int[] list) 
{ 
    return (list as IEnumerable<int>).AllSame(); 
} 

然后,你可以这样写:

if (AllSame(value1, value2, value3, value4, value5)) ... 
+0

downvote的原因? –

+0

我可以相信这被选作为正确的答案......因为已经有** All **扩展方法。 –

+0

@parapurarajkumar,'All()'做了一些不同的事情。如果你的意思是'list.All(x => x == list.First())'',那么对于只能迭代一次的集合来说,这不起作用。 – svick

3

这似乎没什么问题。我唯一的评论是你应该为这个等式引入一个“解释变量”。除了解释计算外,返回现在在检查结果时为断点或跟踪点提供了一个不错的位置。

bool allThreeAreEqual = value1 == value2 && value2 == value3; 
return allThreeAreEqual; 
0

如果你只是寻找优雅(考虑到你已经拥有了有什么不对的解决方案),你可以用good'ol LINQ去。这可以处理三个或更多。

class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> mylist = new List<int>(); 
      mylist.Add(1); 
      mylist.Add(1); 
      mylist.Add(1); 
      mylist.Add(1); 

      bool allElementsAreEqual = mylist.All(x => (x == mylist.First())); 
     } 
    } 
+0

我怀疑它会返回任何更快......没有任何**所有**,使得有必要检查所有元素... –

+0

由于某种原因,我连续两次思考。 Sry基因。 – sehe

+0

如果其中一个不匹配...所有返回false,如果其中两个不匹配,则返回false ...因此,只要All发现其中一个不满足谓词,就不需要评估其余元素的谓词。你是说不是这样吗? MSDN文档中提到**只要结果可以确定就停止源的枚举** –

4

我修改了我的原始答案,以包含更通用的方法,并且不依赖于LINQ或扩展方法。我认为基于这样一个事实,假设这种方法是更安全的,因为它不需要枚举整个列表来确定列表中早期值不同的值时的唯一性。

class Program 
{ 
    static void Main(string[] args) 
    { 
     int value1 = 1, value2 = 2, value3 = 1; 
     Console.WriteLine(AllAreEqual<int>(value1, value2, value3)); 

     Console.Write("V2: 1 value "); 
     Console.WriteLine(AllAreEqual_V2<int>(1)); 

     Console.Write("V2: no value "); 
     Console.WriteLine(AllAreEqual_V2<int>()); 

     Console.Write("V2: 3 values, same "); 
     Console.WriteLine(AllAreEqual_V2<int>(1, 1, 1)); 

     Console.Write("V2: 3 values, different "); 
     Console.WriteLine(AllAreEqual_V2<int>(1, 1, 2)); 

     Console.Write("V2: 2 values, same "); 
     Console.WriteLine(AllAreEqual_V2<int>(1, 1)); 

     Console.Write("V2: 2 values, different "); 
     Console.WriteLine(AllAreEqual_V2<int>(1, 2)); 

     Console.ReadKey(); 
    } 

    static bool AllAreEqual<T>(params T[] args) 
    { 
     return args.Distinct().ToArray().Length == 1; 
    } 

    static bool AllAreEqual_V2<T>(params T[] args) 
    { 
     if (args.Length == 0 || args.Length == 1) 
     { 
      return true; 
     } 

     if (args.Length == 2) 
     { 
      return args[0].Equals(args[1]); 
     } 

     T first = args[0]; 

     for (int index = 1; index < args.Length; index++) 
     { 
      if (!first.Equals(args[index])) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 
+3

+1; 'ToArray()。Length == 1'可以压缩到'Count()== 1'中。 –

+0

O_o。哇。这是通用目的。 –

+0

谢谢Merlyn,感谢精致。 –

0
int nOneInput = 5; 
int nTwoInput = 5; 
int nThreeInput = 5; 
if ((nOneInput + nTwoInput + nThreeInput)/3 == nOneInput) 
{ 
    // all 3 sides are equal when... 
    // the sum of all 3 divided by 3 equals one of the values 
} 
+0

一种简单的方法... –

+2

如果您有类似{5,4,6}的内容,这可能是错误的。平均数仍然是5,但你无法确定所有3是否相等。 – bfs

0

使用LINQ这将是最好的给我们Any()。为什么Any()而不是All()是因为All()将测试集合中所有项目的谓词,而Any()将尽快退出,并且项目与谓词相匹配。

这里我使用反向检查。我正在寻找任何与“a”项目不同的项目。所以尽快找到一个不同的我们知道他们并不都是平等的,所以它退出并返回true。所以它只会测试项目“b”,“c”和“d”。

// all values to compare 
var a = 4; 
var b = 4; 
var c = 4; 
var d = 8; 
var e = 6; 
var f = 4; 

// return if any of the following is different and negate to get a true 
var areSame = (!new[] { b, c, d, e, f}.Any(i => i != a)); 

如果重写等于您可以创建这个就是重复使用,可为多个类型的工作,只要他们实施IEqualityComparer<T>

相关问题