我想根据某些条件筛选对象列表。我见过一些在LINQ查询中使用三元运算符的文章来完成这个任务。LINQ查询中的三元运算符不像预期的那样工作
该代码片段的底部是我的LINQ查询。我期望它测试每个where
,而不是它似乎只尝试第一个where
,而剩下的。 List
不包含我期望的数据。我究竟做错了什么?
private ObservableCollection<LogEvent> m_LogEvents = ApplicationData.MainLogEntries.LogEvents;
public ObservableCollection<LogEvent> LogEvents
{
get { return m_LogEvents; }
set { m_LogEvents = value; RaisePropertyChanged("LogEvents"); }
}
private bool m_ViewDebugLogs = false;
public bool ViewDebugLogs
{
get { return m_ViewDebugLogs; }
set { m_ViewDebugLogs = value; RaisePropertyChanged("ViewDebugLogs"); FilterList(); }
}
private bool m_ViewErrorLogs = true;
public bool ViewErrorLogs
{
get { return m_ViewErrorLogs; }
set { m_ViewErrorLogs = value; RaisePropertyChanged("ViewErrorLogs"); FilterList(); }
}
private bool m_ViewInfoLogs = true;
public bool ViewInfoLogs
{
get { return m_ViewInfoLogs; }
set { m_ViewInfoLogs = value; RaisePropertyChanged("ViewInfoLogs"); FilterList(); }
}
private void FilterList()
{
List<LogEvent> selectedEvents = (from x in LogEvents
where (ViewDebugLogs) ? x.Level == "Debug" : false
where (ViewErrorLogs) ? x.Level == "Error" : false
where (ViewInfoLogs) ? x.Level == "Info" : false
select x).ToList();
}
编辑:这样做的目的是,如果相应的布尔ViewDebugLogs
,ViewErrorLogs
,或ViewInfoLogs
,或三者的任意组合都启用了日志由相应的类型过滤。
我试着从没有成功的答案如下:
这只Debug Logs
获得:
List<LogEvent> selectedEvents = (from x in LogEvents
where (ViewDebugLogs == true) ? x.Level == "Debug" : false
|| (ViewErrorLogs == true) ? x.Level == "Error" : false
|| (ViewInfoLogs == true) ? x.Level == "Info" : false
select x).ToList();
这只会变得Debug Logs
:
List<LogEvent> selectedEvents = (from x in LogEvents
where (ViewDebugLogs == true) ? x.Level == "Debug" : true
|| (ViewErrorLogs == true) ? x.Level == "Error" : true
|| (ViewInfoLogs == true) ? x.Level == "Info" : true
select x).ToList();
这得到什么:
List<LogEvent> selectedEvents = (from x in LogEvents
where (ViewDebugLogs == true) ? x.Level == "Debug" : true
where (ViewErrorLogs == true) ? x.Level == "Error" : true
where (ViewInfoLogs == true) ? x.Level == "Info" : true
select x).ToList();
括号是什么,结合使用'||'而不是多个'where's。谢谢! –