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

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 に答える
0

( LB:sコメントに触発されて) 拡張メソッドを書くことができます:

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

次に (クラスusingを含む名前空間に a を含める場合)、ステートメントを次のように記述できます。Exif

if (true.Int() + false.Int() + true.Int() + true.Int() + 
    false.Int() + true.Int() + true.Int() < 4)
{
    ...
}
于 2012-09-07T11:33:36.767 に答える