嗨说我有三个整数:value1,value2和value3。
我如何最好地确定它们是否完全相同?
我试过了:
return value1 == value2 == value3
但是这说:
运算符'=='不能应用于'bool'和'int'类型的操作数。
所以我猜它比较前两个返回一个布尔值,它试图与第三个做比较。
我可以去:
return value1 == value2 && value2 == value3;
但这似乎变得不整洁。
有人有个好主意吗?
答案 0 :(得分:6)
这对我来说似乎很好。我唯一的评论是你应该引入一个解释变量'等式。除了解释计算之外,返回现在为检查结果时提供断点或跟踪点的好地方。
bool allThreeAreEqual = value1 == value2 && value2 == value3;
return allThreeAreEqual;
答案 1 :(得分: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)) ...
答案 2 :(得分: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 :(得分: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() ));
}
}
答案 4 :(得分: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));
如果覆盖equals,您可以从中创建可重用的通用扩展,只要它们实现IEqualityComparer<T>
答案 5 :(得分:0)
您也可以这样做
bool AllSame(int a, int b, int c, int comparand) {
return board[a] == comparand && board[b] == comparand && board[c] == comparand;
}
答案 6 :(得分:-1)
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
}
答案 7 :(得分:-1)
这就是我要做的
if((value1 == value2) && (value1 == value3) && (value2 == value3))
{
//Whatever you want here
}