Добавление булевых (как целое)
Я написал код в 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)
{
}
Ответы
Ответ 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