2015-08-25 3 views
1

У меня есть следующие классы в проекте приложения магазина Windows.Улучшение вложенности производительности foreach C#

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

foreach (var item in meeting.MeetingPoints) 
     { 
      foreach (var sub in item.SubPoints) 

      { 

       foreach (var at in sub.Attachments) 
       { 

        ... 

       } 
      } 

Мой вопрос в том, есть ли более эффективный способ сделать это, поскольку наличие 3 вложенных foreach занимает около 4 или 5 секунд.

+0

Сколько у вас элементов? И что вы делаете внутри петель? – MarcinJuraszek

+2

Если вам нужно пройти через все «вложения» для всех «подпунктов» всех «собраний», вам, скорее всего, придется перебирать все «вложения» для всех «подпунктов» всех «собраний». Это может быть сделано более эффективно, если вам не нужно перебирать все ... –

+0

количество элементов зависит от того, что я делаю внутри циклов, считывает информацию вложения в новый объект и добавляет этот объект в список. – Ric

ответ

0

Я не уверен в увеличении производительности, я думаю, вы можете увидеть некоторые из них, но если вы хотите уйти от вложенных циклов, подумайте об использовании лямбда/SelectMany, чтобы получить самую низкую коллекцию, которую нужно перебрать, чтобы выполнить работу против , Другими словами, если вы только собираетесь действовавшей против вложений затем рассмотреть что-то вроде этого:

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

ну, это немного улучшилось, но это было что-то вроде 0,3 сек: D – Ric

0

Вы можете попробовать заменить некоторые из foreach блоков с Parallel.ForEach. Просто найдите это в окне вывода «EventSourceException: нет свободных буферов, доступных из операционной системы (например, скорость события слишком быстро)», и если это произойдет, замените одну из Parallel.ForEach invocations нормальным блоком foreach. Это происходит, если события срабатывают слишком быстро, и это может негативно повлиять на производительность, а не на то, чтобы помочь вам.

+0

У меня есть пара ожидающих звонков внутри вещей, которые я делаю в третьем foreach – Ric

+1

Возможно, вы должны упомянуть об этом в вопросе. Это может быть ожидаемый код, который замедляет весь процесс. Можете ли вы попытаться просто прокомментировать ожидающие звонки, чтобы увидеть, есть ли существенная разница в производительности? –

Смежные вопросы