31

我在 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)
{

}
4

6 回答 6

62

尝试在方法参数IEnumerable<T>.Count(Func<T,bool>)上使用fromSystem.LinqTas 。boolparams

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();
于 2012-09-07T11:23:23.677 回答
16

您可以创建一个数组并使用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)
{

}
于 2012-09-07T11:23:10.553 回答
13

这是一个更有趣的例子:

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); }
}
于 2012-09-07T11:33:04.363 回答
4

Convert.ToInt32(true) + Convert.ToInt32(false) + Convert.ToInt32(true) 在这种情况下也可以工作我认为这是我们最简单的方法

于 2012-09-07T11:25:35.340 回答
0

(受LB: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)
{
    ...
}
于 2012-09-07T11:33:36.767 回答
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
于 2012-09-07T13:07:31.360 回答