我在AS3中编写了一个代码,它允许我检查特定数量的事情是否属实......
If (true + false + true + true + false + true + true < 4)
{
}
当我尝试用C#重写时,它告诉我我不能添加类型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)
{
}
答案 0 :(得分:56)
尝试使用System.Linq
中的IEnumerable<T>.Count(Func<T,bool>)
,T
作为bool
,{strong> 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();
答案 1 :(得分:15)
您可以创建一个数组并使用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)
{
}
答案 2 :(得分:12)
这是一个更有趣的例子:
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); }
}
答案 3 :(得分:2)
Convert.ToInt32(true) + Convert.ToInt32(false) + Convert.ToInt32(true)
也适用于这种情况我认为这是我们最简单的方法
答案 4 :(得分:0)
(灵感来自 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)
{
...
}
答案 5 :(得分:0)
您可以为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