-3

私は、「プロジェクト」の現在のステータスを登録する非常に時代遅れの手法に関する自動化されたフォローアップ システムに取り組んでいます。プロジェクト。チェックできるボックスは 11 個あり、システムは複数の選択を受け入れます。

たとえば、ユーザーは「確認済み」または「フォローアップが必要」または「スケジュール済み」または「クライアントと話す」というラベルの付いたチェックボックスを選択できます (11 の選択肢があります)。

ここに問題があります-これを書いた人は誰でも、これらの選択を「ビットサム」でデータベースに保存したため、表示されるのはチェックボックスの選択の元のビット[]のintです。

私がする必要があるのは、データベースから整数を読み取り、それを 1 || の 11 個の値のビット配列に戻すことです。0 の場合、そのビット配列から、自動化されたフォローアップを実行する必要があるかどうかを判断するために、文字列値のどのボックスがチェックされているかを判断する必要があります。

基本的に「確認済み」にチェックが入っていればフォローはしたくないですし、「要フォロー」にチェックが入っていればフォローが必要です。

ここでの問題は、複数の選択肢が存在する可能性があることです。

したがって、int が bit[] に変換された後、たとえば

1,0,1,0,0,0,1,1,1,0,1 各 int は、チェックされたボックスを表します。

上記をボックスラベルを表す文字列の配列に変換して、どのボックスがチェックされているかを判断する方法を見つける必要があります。

4

1 に答える 1

3

C# でこれを行う通常の方法は、フラグ列挙を使用することです。これはまさにビット フィールドです。

[Flags]
enum ProjectStatus
{
    Confirmed = 1,
    NeedsFollowUp = 2,
    SpokenWithClient = 4,
    ....
}

特定のフラグが設定されているかどうかをテストするには:

ProjectStatus status = (ProjectStatus)intFromDb;
if( ( status & ProjectStatus.Confirmed ) == ProjectStatus.Confirmed )
    // the Confirmed flag is set

Enum.HasFlags.NET 4 以降を使用している場合は、これを簡素化する拡張メソッドもあります。

このようにしたくない場合は、次のようにして、位置のビットxが設定されているかどうかを確認できます。

bool isSet = ( intFromDb & ( 1 << x ) ) != 0;

そして、それを使用して文字列を作成します。

編集:ビットごとの演算子とその機能について少し読んでおくことをお勧めします。これは良いスタートかもしれません: http://blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

于 2013-10-15T20:32:51.847 に答える