Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将嵌套for循环转换为单个LINQ语句_C#_Linq_Syntax_Iteration_Structure - Fatal编程技术网

C# 将嵌套for循环转换为单个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].

有人能帮我把这个嵌套结构转换成一个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]);
                    }
                }
            }
        }
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);
    });
});