C# 将嵌套for循环转换为单个LINQ语句
有人能帮我把这个嵌套结构转换成一个LINQ语句吗C# 将嵌套for循环转换为单个LINQ语句,c#,linq,syntax,iteration,structure,C#,Linq,Syntax,Iteration,Structure,有人能帮我把这个嵌套结构转换成一个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].
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]);
}
}
}
}
EventLog[]logs=EventLog.GetEventLogs();
for(int i=0;i
试试这个:
EventLog[] logs = EventLog.GetEventLogs();
remoteAccessLogs.AddRange(
logs.Where(l => l.LogDisplayName.Equals("AAA"))
.Select(l => l.Entries)
.Where(le => le.Source.Equals("BBB"));
但是,如果性能是一个问题,我希望它至少具有相同的算法复杂性,如果不是更糟的话,因为我们将再次迭代列表以添加范围。请尝试以下操作:
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<EventLogEntry>()
select entry
);
remoteAccessLogs.AddRange(
从登录EventLog.GetEventLogs()开始
来自log.Entries.Cast()中的条目
选择条目
);
编辑
我忘了where子句
List<EventLogEntry> remoteAccessLogs = new List<EventLogEntry>();
remoteAccessLogs.AddRange(
from log in EventLog.GetEventLogs()
where log.LogDisplayName.Equals("AAA")
from entry in log.Entries.Cast<EventLogEntry>()
where entry.Source.Equals("BBB")
select entry
);
List remoteAccessLogs=new List();
remoteAccessLogs.AddRange(
从登录EventLog.GetEventLogs()开始
其中log.LogDisplayName.Equals(“AAA”)
来自log.Entries.Cast()中的条目
其中entry.Source.Equals(“BBB”)
选择条目
);
嵌套循环通常以多个“from”子句结尾(编译器将这些子句转换为对SelectMany
的调用):
(这是假设在调用之前,remoteAccessLogs
是空的,并且您很乐意直接对其进行迭代-如果需要列表,您可以调用ToList()
)
这是点符号形式:
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();
注意,我使用了重载==作为字符串,因为我发现它比调用Equals
方法更容易阅读。不过,这两种方法都可以使用。看看:
List<Entries> result = new List<Entries>();
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);
});
});
列表结果=新列表();
GetEventLogs().Where(x=>x.LogDisplayName.Equals(“AAA”)).ToList().ForEach(委托(Log-en)
{
en.Entries.Where(y=>y.Source.Equals(“BBB”,StringComparison.InvariantCultureInogoreCase)).ToList().ForEach(委托(Entries ent)
{
结果:添加(ent);
});
});
嗯,不,他是说嵌套的,就像它一样。我总是忘记使用=
是可以接受的,因为我确实希望代码样本在iPhone上正确显示。一个给我想!交叉连接是一种更简单的方法
List<Entries> result = new List<Entries>();
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);
});
});