将嵌套的for循环转换为单个LINQ语句
有人可以帮我把这个嵌套结构变成一个LINQ语句吗?
EventLog[] logs = EventLog.GetEventLogs(); for (int i = 0; i < logs.Length; i++) { if (logs[i].LogDisplayName.Equals("AAA")) { for (int j = 0; j < logs[i].Entries.Count; j++) { if (logs[i].Entries[j].Source.Equals("BBB")) { remoteAccessLogs.Add(logs[i].Entries[j]); } } } }
嵌套循环通常以多个“from”子句结束(由编译器转换为对SelectMany
的调用):
var remoteAccessLogs = from log in EventLogs.GetEventLogs() where log.LogDisplayName == "AAA" from entry in log.Entries where entry.Source == "BBB" select entry;
(假设在此调用之前remoteAccessLogs
为空,并且您很乐意直接迭代它 – 如果需要List
可以调用ToList()
。)
这是点符号forms:
var remoteAccessLogs = EventLogs.GetEventLogs() .Where(log => log.LogDisplayName == "AAA") .SelectMany(log => log.Entries) .Where(entry => entry.Source == "BBB");
或者列表:
var remoteAccessLogs = EventLogs.GetEventLogs() .Where(log => log.LogDisplayName == "AAA") .SelectMany(log => log.Entries) .Where(entry => entry.Source == "BBB") .ToList();
请注意,我使用了重载的== for string,因为我发现它比调用Equals
方法更容易阅读。 要么会工作。
试试这个:
EventLog[] logs = EventLog.GetEventLogs(); remoteAccessLogs.AddRange( logs.Where(l => l.LogDisplayName.Equals("AAA")) .Select(l => l.Entries) .Where(le => le.Source.Equals("BBB"));
但是,如果性能是一个问题,我预计这至少会有相同的算法复杂性,如果不是更糟,因为我们再次迭代列表到AddRange。
请尝试以下方法:
from log in logs where log.LogDisplayName.Equals("AAA") select (from entry in log.Entries where entry.Source.Equals("BBB") select entry);
我有这个解决方案,我假设remoteAccessLogs是List类型
remoteAccessLogs.AddRange( from log in EventLog.GetEventLogs() from entry in log.Entries.Cast() select entry );
编辑
我忘记了where子句
List remoteAccessLogs = new List (); remoteAccessLogs.AddRange( from log in EventLog.GetEventLogs() where log.LogDisplayName.Equals("AAA") from entry in log.Entries.Cast () where entry.Source.Equals("BBB") select entry );
看一看:
List result = new List (); GetEventLogs().Where(x => x.LogDisplayName.Equals("AAA")).ToList().ForEach(delegate(Log en) { en.Entries.Where(y => y.Source.Equals("BBB", StringComparison.InvariantCultureIgnoreCase)).ToList().ForEach(delegate(Entries ent) { result.Add(ent); }); });