我有一个布尔变量数组,如果此数组中的所有元素具有相同的值,我想返回true,否则返回false。我知道我可以循环遍历所有元素,但我想知道C#中是否有更快的方法。
答案 0 :(得分:6)
var allAreTheSame = myArray.All(a => a) || myArray.All(a => !a)
答案 1 :(得分:5)
var result = array.Distinct().Count() == 1;
答案 2 :(得分:2)
// Assuming the array is NOT empty
// Get first value
var firstValue = myArray.First();
// Check if all other values are identical
var allidentical = myArray.Skip(1).All(z => z == firstValue);
答案 3 :(得分:1)
Enumerable.Range(0, array.Length-1).All(i => array[i] == array[i+1])
编辑:在评论后修复
Enumerable.Range(1, array.Length).All(i => array[i] == array[0])
答案 4 :(得分:0)
var allAreTheSame = myArray.Distinct().Count() == 1
只是大卫的方法的替代方案,稍短且可能更有效,因为我认为枚举器组合将导致数组仅循环一次。
答案 5 :(得分:0)
我会选择扩展方法。我总是喜欢这些方法:
包含扩展方法的类将是:
public static class ExtensionMethods
{
public static bool AreAll<T>(this T[] source, Func<T, bool> condition)
{ return source.Where(condition).Count() == source.Count(); }
public static bool AreAllTheSame<T>(this IEnumerable<T> source)
{ return source.Distinct().Count() == 1; }
}
你看我有2个扩展方法,一个采用Func,一个采用无参数。
如果要检查数组中的所有元素是否具有相同的值(例如,所有元素都为true,或者所有元素都为false),则调用第一个。
当您不想检查特定参数时,会调用第二个,但是如果您只是想查看所有值是否相同。
而不是一个演示扩展方法本身的小演示:
class Program
{
static void Main(string[] args)
{
bool[] array = { true, false, true, false, true };
bool[] trueArray = { true, true, true, true };
Console.WriteLine("Searching with a predicate:");
Console.WriteLine(array.AreAll(x => x).ToString());
Console.WriteLine(array.AreAll(x => !x).ToString());
Console.WriteLine(trueArray.AreAll(x => x).ToString());
Console.WriteLine(trueArray.AreAll(x => !x).ToString());
Console.WriteLine("Searching without a predicate:");
Console.WriteLine(array.AreAllTheSame().ToString());
Console.WriteLine(array.AreAllTheSame().ToString());
Console.WriteLine(trueArray.AreAllTheSame().ToString());
Console.WriteLine(trueArray.AreAllTheSame().ToString());
Console.ReadLine();
}
}
这将产生以下输出:
让我们希望它有所帮助。
答案 6 :(得分:0)
只是为了一个有趣的解决方案:
!(array.Any(b => b) && array.Any(b => !b));
这里有两个循环。其中一个应该退出数组中的第一个元素。另一个应该在第一次出现时退出,该出现与数组中的第一次出现不同。对于空数组,它也将返回true。