سؤال

من الصعب فهم أعلام البتات :)

وأنا أعلم عن هذه و هذه أسئلة وأنا أفهم الإجابات وحتى اتبعت هذا مقالة - سلعة من صديق جيد لي.

لكن ما زلت غير قادر على معرفة ذلك عندما أحتاج إلى "إبعاد" أكثر من المعيار ...

ما أحاول فعله هو:

    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();

أحتاج إلى تصفية كائن قائمة ، حتى أتمكن من الحصول على ما يريده المستخدم (إظهار أخطاء المعلومات فقط ، وأخطاء الاستثناء ولكن سيتم دائمًا عرض أخطاء التحذير) ...

هل هناك طريقة مباشرة للقيام بذلك أو أحتاج إلى تصفيةه يدويًا دون استخدام تعبير Lambda؟

شكرا لكم على كل المساعدة.

هل كانت مفيدة؟

المحلول

مع

x.Type == showType

سوف تحصل فقط على العناصر التي تطابق الكل الظروف (أعلام بت) بالضبط. مع

(x.Type & showType) != 0

ستجد جميع العناصر التي تحتوي على تطابق واحد على الأقل مع ShowType ، وهو ما تريده على الأرجح.

نصائح أخرى

إذا وجدت هذه العمليات مربكة - وبصراحة ، فأنا بالتأكيد - فأنا أفكر في زيادة مستوى التجريد. اكتب لنفسك بعض أساليب تمديد المساعد.

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)));

بدلاً من إضافة مجموعة من الأعلام ثم أخذها بعيدًا ، ببساطة لا تضيفها في المقام الأول.

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

يجب ان يكون

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

بما أنك لا تريد أن يكون النوع بالضبط ما هو Shartype ، أليس كذلك؟ يمكنك التكرار يدويًا على القائمة والقيام بمقارنة وإزالة ما لا تحتاجه على الرغم من أنني لست متأكدًا من أنه حل أنيق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top