位标志有点难以理解:)
我知道this和this个问题,我确实理解答案,我甚至从我的一位好朋友那里了解了article。
但是当我需要“退出”超过标准时,我仍然无法弄明白......
我想做的是:
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错误,异常错误,但始终会显示WARNing错误)......
是否有直接的方法可以执行此操作,或者我需要手动过滤它而不使用LAMBDA表达式?
感谢您的帮助。
答案 0 :(得分:10)
用
x.Type == showType
您只能获得与所有条件(位标志)完全匹配的项目。与
(x.Type & showType) != 0
你会发现所有与showType至少匹配1位的项目,这可能是你想要的。
答案 1 :(得分: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)));
不是添加一堆标志然后取走它们,而是首先不要添加它们。
答案 2 :(得分:2)
gv.DataSource = list.FindAll(x => x.Type == showType));
应该是
gv.DataSource = list.FindAll(x => 0 != (x.Type & showType)));
因为你不希望Type正好是showType,对吧?您可以手动迭代列表并进行比较并删除您不需要的内容,但我不确定它是否是一个优雅的解决方案。