提高嵌套的foreach性能C#
我在Windows Store应用程序项目中拥有以下类。
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; }
}
和这个
public class MeetingPoint
{
public string id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int Position { get; set; }
public List<Attchments> Attachments { get; set; }
public List<MeetingPoint> SubPoints { get; set; }
public int AttachmentNumber { get; set; }
public string details { get; set; }
public string executiveSummary { get; set; }
public string presenter { get; set; }
public string coPresenter { get; set; }
public Double duration { get; set; }
public string purpose { get; set; }
public string supportedBy { get; set; }
public int num { get; set; }
}
在其中一个页面中,我做了一个像这样的搜索,我试图在每个MeetingPoint
每个SubPoint
中获取Attachments
foreach (var item in meeting.MeetingPoints)
{
foreach (var sub in item.SubPoints)
{
foreach (var at in sub.Attachments)
{
...
}
}
我的问题是如果有一个更有效的方法,因为有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
}
您可以尝试用Parallel.ForEach
替换一些foreach
块。 只需在输出窗口“EventSourceException:操作系统中没有可用的缓冲区(例如事件速率太快)”中查找它,如果发生这种情况,请将其中一个Parallel.ForEach
调用替换为正常的foreach
块。 如果事件过快发生,这可能会对性能产生负面影响,而不是帮助您。