C#とVb.netでは、真と偽の値(Dotnet 2.0)を確認するためにループを繰り返すことなく何らかの方法でビットマップをチェックしますか?check bitArrayには真または偽の値がどのように含まれていますか?
答えて
私はあなたが(BitArray
がBitVector32
とは異なり、任意の長さにすることができたように)ボンネットの下にループせずにそれを行うことができどのような方法があります疑うが、あなただけのドンが」 tはそれを自分で書きたい:BitArray
に
var hasAnyTrue = input.Cast<bool>().Contains(true);
var hasAnyFalse = input.Cast<bool>().Contains(false);
あなたがBitArrayを使用して行うことができるかどうかは分かりませんが、int、longなどを使用して、それが0より大きい(trueの場合)か、それを行うデータ型(falseの場合)
ので、このような何か:
bool IsTrue (int bitArray)
{
return bitArray != 0;
}
bool isFalse (int bitArray)
{
return bitArray != int.MinValue;
}
、それはあまりにも、それはOKキャストと仮定すると、私の提案になる予定でした。 – Ian
BitArrayは型です。それは 'int'ではありません。 –
ええ、あなたが言ったように、実際にはループを行わずに値をチェックする方法はありません。私はビット配列をチェックする方法を提供していただけで、必ずしもBitArray型を使用する必要はありません。 – kemiller2002
インデックスと個別boolean
値をチェックするには、明白な解決策です。パフォーマンスについて心配している場合は、まず自分の抽象化を作成することを検討する必要がありますが、ほとんどの操作でBitArray
を使用することをお望みなら、をint[]
(正しいサイズ(Count >> 5
))までチェックし、その後、これらのintに対して必要に応じてゼロまたは非ゼロのチェックを実行します。
System.CollectionsのBitArrayクラスを使用している場合は、次のコードを使用して何かが真であるかどうかを判断できます。
C#バージョン
var anyTrue = myArray.Cast<bool>().Any(x => x);
VB.Netバージョン実際
Dim anyTrue = myArray.Cast(Of Boolean)().Any(Function(x) x)
'Any'の代わりにもっと単純な' .Contains(true) 'を使わないことの利点はありますか?実際には、これは私が最初にやったやり方ですが、「Contains」が頭に浮かんできました。私は何か特別な理由が見つからないので、変更しました。アイデア? –
もっと読みやすい.Any()を使う – juFo