C# 提高嵌套foreach的性能#

C# 提高嵌套foreach的性能#,c#,foreach,windows-runtime,nested-loops,C#,Foreach,Windows Runtime,Nested Loops,我在windows应用商店应用程序项目中有以下课程 public class Meeting { public string Id { get; set; } public string Organizer { get; set; } public string Organization { get; set; } public string Name { get; set; } public string MeetingType { get; s

我在windows应用商店应用程序项目中有以下课程

    public class Meeting
{
    public string Id { get; set; }
    public string Organizer { get; set; }
    public string Organization { get; set; }
    public string Name { get; set; }
    public string MeetingType { get; set; }
    public string Description { get; set; }
    public Address Address { get; set; } //X = LAT; Y=LNG
    public DateTime StartDate { get; set; }
    public DateTime EndTime { get; set; }
    public string Status { get; set; }
    public List<MeetingPoint> MeetingPoints { get; set; }
    public List<MeetingInvitee> Invitees { get; set; }
}

我的问题是,是否有更有效的方法来实现这一点,因为3个嵌套foreach大约需要4或5秒。

我不确定性能是否会提高,我想您可能会看到一些,但是如果你想摆脱嵌套的循环,考虑使用lambda/SelectMany来达到最低的集合,你需要迭代来反作用。换言之,如果你只会对附件进行操作,那么考虑这样的事情:

 var greatGandChildrenFlattened = parent.Children.SelectMany(c => c.GrandChildren.SelectMany(gc => gc.GreatGrandChildren));
 foreach (var item in greatGandChildrenFlattened)
 {
     //do work on item
 }

我不确定性能的增加,我想你可能看到一些,但是如果你想摆脱嵌套循环,考虑使用lambda/SelectMany来达到最低的集合,你需要迭代来反作用。换言之,如果你只会对附件进行操作,那么考虑这样的事情:

 var greatGandChildrenFlattened = parent.Children.SelectMany(c => c.GrandChildren.SelectMany(gc => gc.GreatGrandChildren));
 foreach (var item in greatGandChildrenFlattened)
 {
     //do work on item
 }


您可以尝试将一些
foreach
块替换为
Parallel.foreach
。只需在输出窗口“EventSourceException:No Free Buffers available from the operating system(例如,事件速率过快)”(EventSourceException:No Free Buffers available from the Operation)(事件源异常:操作系统没有可用的缓冲区))中查找,如果发生这种情况,请使用正常的
ForEach
块替换其中一个
Parallel.ForEach
调用。如果事件触发过快,则会发生这种情况,这可能会对性能产生负面影响,而不是帮助您。

您可以尝试使用
Parallel.foreach
替换一些
foreach
块。只需在输出窗口“EventSourceException:No Free Buffers available from the operating system(例如,事件速率过快)”(EventSourceException:No Free Buffers available from the Operation)(事件源异常:操作系统没有可用的缓冲区))中查找,如果发生这种情况,请使用正常的
ForEach
块替换其中一个
Parallel.ForEach
调用。如果事件触发过快,可能会对性能产生负面影响,而不是帮助您,则会发生这种情况。

您有多少元素?你在循环中做了什么?如果你需要循环所有
会议的所有
子点的所有
附件
,那么你很可能必须循环所有
会议的所有
子点
,所有
会议的所有
附件
。如果您不需要遍历所有内容,则可以提高效率……元素的数量会有所不同,我在循环中所做的工作是将附件信息读取到一个新对象,然后将该对象添加到列表中。@dubstylee不幸的是,我这样做了。我不确定是否有更好的方法来处理Linq或其他东西,这就是为什么我问:)循环占用了多少时间,而最里面的循环占用了多少时间?我猜您遗漏的代码实际上就是要关注的代码(不是有三个循环)。您有多少个元素?你在循环中做了什么?如果你需要循环所有
会议的所有
子点的所有
附件
,那么你很可能必须循环所有
会议的所有
子点
,所有
会议的所有
附件
。如果您不需要遍历所有内容,则可以提高效率……元素的数量会有所不同,我在循环中所做的工作是将附件信息读取到一个新对象,然后将该对象添加到列表中。@dubstylee不幸的是,我这样做了。我不确定是否有更好的方法来处理Linq或其他东西,这就是为什么我问:)循环占用了多少时间,而最里面的循环占用了多少时间?我猜你遗漏的代码实际上是要关注的代码(不是有三个循环)。它确实有点改进,但有点像0.3秒:它确实有点改进,但这大约是0.3秒:我在第三次演讲中做了一些等待电话,你可能应该在问题中提到这一点。可能是等待已久的代码使整个过程变得缓慢。你能试着对等待电话进行评论,看看性能是否有重大差异吗?我在第三次演讲中做了一些等待电话,你可能应该在问题中提到这一点。可能是等待已久的代码使整个过程变得缓慢。你能试着对waits通话进行评论,看看性能是否有重大差异吗?
 var greatGandChildrenFlattened = parent.Children.SelectMany(c => c.GrandChildren.SelectMany(gc => gc.GreatGrandChildren));
 foreach (var item in greatGandChildrenFlattened)
 {
     //do work on item
 }