[解決済み] 複数のブーリアンが "true "であるかどうかをエレガントに判定する。
質問
5つのブーリアン値のセットがある。これらのうちの1つ以上が真である場合、私は特定の関数を実行したいと思います。単一のif()文でこの条件をチェックすることを可能にする、あなたが考えることができる最もエレガントな方法は何ですか?ターゲット言語はC#ですが、私は他の言語でのソリューションにも興味があります(特定の組み込み関数について話していない限りにおいて)。
1つの興味深いオプションは、バイトにブール値を格納し、右シフトを行い、元のバイトと比較することです。次のようなものです。
if(myByte && (myByte >> 1))
しかし、これは個別のブール値をバイトに変換する必要があり (bitArray を介して?) 、少し (ダジャレで) 不器用な感じがします...。
[edit]すみません、これは次のようになるはずでした。
if(myByte & (myByte - 1))
[/edit]です。
注:これはもちろん古典的なquot;population count", "sideways addition" or "Hamming weight" programming problemに非常に近いですが、全く同じというわけではありません。私はビットがいくつセットされているか知る必要はなく、複数セットされていればいいのです。私の希望は、これを達成するためにもっと簡単な方法があることです。
どのように解決するのですか?
どのように
if ((bool1? 1:0) + (bool2? 1:0) + (bool3? 1:0) +
(bool4? 1:0) + (bool5? 1:0) > 1)
// do something
とか一般化された方法なら
public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
{
int trueCnt = 0;
foreach(bool b in bools)
if (b && (++trueCnt > threshold))
return true;
return false;
}
または、他の回答で提案されているようにLINQを使用します。
public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
{ return bools.Count(b => b) > threshold; }
EDIT (Joel Coehoornの提案を追加する。 (.Net 2.x およびそれ以降で)
public void ExceedsThreshold<T>(int threshold,
Action<T> action, T parameter,
IEnumerable<bool> bools)
{ if (ExceedsThreshold(threshold, bools)) action(parameter); }
または.Net 3.5以降で使用できます。
public void ExceedsThreshold(int threshold,
Action action, IEnumerable<bool> bools)
{ if (ExceedsThreshold(threshold, bools)) action(); }
の拡張として、あるいは
IEnumerable<bool>
public static class IEnumerableExtensions
{
public static bool ExceedsThreshold<T>
(this IEnumerable<bool> bools, int threshold)
{ return bools.Count(b => b) > threshold; }
}
の使い方は、次になります。
var bools = new [] {true, true, false, false, false, false, true};
if (bools.ExceedsThreshold(3))
// code to execute ...
関連
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] エラーメッセージ 'Unable to load one or more of requested types. 詳細については、LoaderExceptionsプロパティを取得してください'。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない