改进嵌套的foreach性能C#

时间:2015-08-25 20:46:20

标签: c# foreach windows-runtime nested-loops

我在Windows商店应用程序项目中有以下类。

app.controller('TruckDetailsController', function (transferService, $scope, dataShare, $stateParams)
               { 
  //The below is api call. Ideally this number 13 (ID) should come from the details page. 
  
  ctrl.GetTruckDetails = transferService.getTruckDetails(13).then(function (d) 
  { 
    $scope.data = d; 
    angular.forEach($scope.data, function (value, index) 
    { 
      console.log(index); 
    });
  }); 
}; }); }

和这一个

    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; } } 的每个Attachments中获取SubPoint

MeetingPoint

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

2 个答案:

答案 0 :(得分:0)

我不确定性能提升,我想你可能会看到一些,但如果你想摆脱嵌套循环,可以考虑使用lambda / SelectMany来获取你需要迭代的最低集合来进行工作。换句话说,如果你只是要对附件进行操作,那么请考虑这样的事情:

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

答案 1 :(得分:0)

您可以尝试使用foreach替换部分Parallel.ForEach块。只需在输出窗口中查找“EventSourceException:操作系统中没有可用的免费缓冲区(例如事件速率太快)”,如果发生这种情况,请用正常Parallel.ForEach替换其中一个foreach次调用块。如果事件发生得太快而且可能会对性能产生负面影响而不是帮助您,则会发生这种情况。