Подтвердить что ты не робот

Добавление булевых (как целое)

Я написал код в AS3, который позволил мне проверить, действительно ли определенное количество вещей...

If (true + false + true + true + false + true + true < 4)
{

}

Когда я попытался переписать в С#, он говорит мне, что я не могу добавить тип bool и bool. Это лучший способ сделать это, чтобы переписать его вот так? Или есть какая-то более простая работа?

If ((true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) < 4)
{

}
4b9b3361

Ответ 1

Попробуйте использовать IEnumerable<T>.Count(Func<T,bool>) от System.Linq, с T как bool, на params параметр метода.

public static int CountTrue(params bool[] args)
{
   return args.Count(t => t);
}

Использование

// The count will be 3
int count = CountTrue(false, true, false, true, true);

Вы также можете ввести this метод расширения:

public static int TrueCount(this bool[] array)
{
   return array.Count(t => t);
}

Использование

// The count will be 3
int count = new bool[] { false, true, false, true, true }.TrueCount();

Ответ 2

Вы можете создать массив и использовать Count:

if ((new []{true, false, true, true, false, true, true}).Count(x=>x) < 4)
{

}

или Sum:

if ((new []{true, false, true, true, false, true, true}).Sum(x=>x?1:0) < 4)
{

}

Ответ 3

Вот более забавный пример:

if ((BoolCount)true + false + true + true + false + true + true <= 5)
{
    Console.WriteLine("yay");
}

Используя этот класс:

struct BoolCount
{
    private readonly int c;
    private BoolCount(int c) { this.c = c; }

    public static implicit operator BoolCount(bool b)
        { return new BoolCount(Convert.ToInt32(b)); }

    public static implicit operator int(BoolCount me)
        { return me.c; }

    public static BoolCount operator +(BoolCount me, BoolCount other)
        { return new BoolCount(me.c + other.c); }
}

Ответ 4

Convert.ToInt32(true) + Convert.ToInt32(false) + Convert.ToInt32(true) также работают в этом случае, я думаю, что это самый простой способ:

Ответ 5

(Вдохновленный комментарием L.B.:s) вы можете написать метод расширения:

static class Ex
{
    public static int Int(this bool x) { return x ? 1 : 0; }
}

И затем (если вы включите using в пространство имен, содержащее класс Ex), вы можете написать инструкцию if следующим образом:

if (true.Int() + false.Int() + true.Int() + true.Int() + 
    false.Int() + true.Int() + true.Int() < 4)
{
    ...
}

Ответ 6

Вы можете написать метод расширения для класса BitArray. Я не уверен, что производительность будет лучше, чем использование Linq, но по крайней мере ее еще один вариант:

public static int CountSetBits(this BitArray theBitArray)
{
   int count = 0;
   for (int i = 0; i < theBitArray.Count; i++)
   {
      count += (theBitArray.Get(i)) ? 1 : 0;
   }
   return count; 
}

Использование:

BitArray barray = new BitArray(new [] { true, true, false, true });
int count = barray.CountSetBits(); // Will return 3