C#:如何检查布尔变量数组中的所有元素是否具有相同的值(All tr​​ue或All false)?

时间:2014-06-05 13:12:09

标签: c# arrays

我有一个布尔变量数组,如果此数组中的所有元素具有相同的值,我想返回true,否则返回false。我知道我可以循环遍历所有元素,但我想知道C#中是否有更快的方法。

7 个答案:

答案 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();
    }
}

这将产生以下输出:

enter image description here 让我们希望它有所帮助。

答案 6 :(得分:0)

只是为了一个有趣的解决方案:

!(array.Any(b => b) && array.Any(b => !b));

这里有两个循环。其中一个应该退出数组中的第一个元素。另一个应该在第一次出现时退出,该出现与数组中的第一次出现不同。对于空数组,它也将返回true。