4

ビットフラグは理解するのが少し難しいです:)

私はこれこの質問について知っており、答えも理解しています。また、親友からのこの記事もフォローしました。

でも、基準以上の「進化」がいつ必要なのか、いまだにわかりません…

私がやろうとしているのはこれです:

    if (HttpContext.Current.Session["DebugSessionText"] != null)
    {
        showType = parDebug.Write2LogType.WARN | 
                   parDebug.Write2LogType.ERROR | 
                   parDebug.Write2LogType.INFO;

        if (!chkInfo.Checked)
            showType &= ~parDebug.Write2LogType.INFO;  // remove INFOs        
        if (!chkError.Checked)
            showType &= ~parDebug.Write2LogType.ERROR; // remove ERRORs

        List<myDebugRow> list =
            (List<myDebugRow>)HttpContext.Current.Session["DebugSessionText"];

        gv.DataSource = list.FindAll(x => x.Type == showType));
    }
    gv.DataBind();

List オブジェクトをフィルタリングする必要があるので、ユーザーが望むものだけを取得できます (INFO エラー、例外 ERROR のみを表示しますが、WARNing エラーは常に表示されます) ...

これを行う直接的な方法はありますか、または LAMBDA 式を使用せずに手動でフィルタリングする必要がありますか?

助けてくれてありがとう。

4

3 に答える 3

10

x.Type == showType

すべての条件 (ビット フラグ) に正確に一致するアイテムのみを取得します。と

(x.Type & showType) != 0

showType と少なくとも 1 ビット一致するすべてのアイテムが見つかります。これはおそらく必要なものです。

于 2009-10-15T17:31:26.550 に答える
9

これらの操作が混乱していることに気付いた場合(そして率直に言って、私は確かにそうです)、抽象化のレベルを上げることを検討してください。ヘルパー拡張メソッドを自分で作成します。

static WriteToLogType AddWarn(this WriteToLogType x) { return x | WriteToLogType.WARN; }
static WriteToLogType ClearWarn(this WriteToLogType x) { return x & ~WriteToLogType.WARN; }
static bool HasWarn(this WriteToLogType x) { return 0 != (x & WriteToLogType.WARN); }
// same for Error, Info
static bool HasExactly(this WriteToLogType x, WriteToLogType y) { return x == y; }
static bool HasAny(this WriteToLogType x, WriteToLogType y) { return 0 != (x & y); }
static bool HasAll(this WriteToLogType x, WriteToLogType y) { return y == (x & y); }

そして今、あなたのプログラムは

    showType = WriteToLogType.None.AddWarn().AddInfo().AddError();
    if (!chkInfo.Checked) showType = showType.ClearInfo();
    if (!chkError.Checked) showType = showType.ClearError();
    List<myDebugRow> list = whatever;
    gv.DataSource = list.FindAll(x => x.Type.HasAny(showType)));

私はあなたが同意することを願っていますが、そのすべてのビットをいじるよりもはるかに明確です。しかし、これをさらに明確にすることができます。

    showType = WriteToLogType.None.AddWarn();
    if (chkInfo.Checked) showType = showType.AddInfo();
    if (chkError.Checked) showType = showType.AddError();
    List<myDebugRow> list = whatever;
    gv.DataSource = list.FindAll(x => x.Type.HasAny(showType)));

たくさんのフラグを追加してから削除する代わりに、最初からフラグを追加しないでください。

于 2009-10-15T18:04:29.427 に答える
2
gv.DataSource = list.FindAll(x => x.Type == showType));

する必要があります

gv.DataSource = list.FindAll(x => 0 != (x.Type & showType)));

TypeをshowTypeとまったく同じにしたくないので、そうですか?リストを手動で繰り返し、比較を行って不要なものを削除することもできますが、それがエレガントなソリューションかどうかはわかりません。

于 2009-10-15T17:29:29.750 に答える