2014-12-31 4 views
1

Это выше моего уровня мастерства в Linq, поэтому я обращаюсь за помощью. Этот код работает, но я думаю, что он может работать намного быстрее и занимать меньше места.Выбор объектов в списке списков

private List<DateTime> GetUniqueTimeStamps() 
{ 
    List<DateTime> timeStamps = new List<DateTime>(); 

    foreach (KeyValuePair<string, Instrument> kvp in Instruments) 
    { 
     foreach (Bar bar in kvp.Value.Bars) 
     { 
      timeStamps.Add(bar.Time); 
     } 
    } 

    return timeStamps.Distinct().ToList(); 
} 

Как я могу использовать LINQ, чтобы пропустить все петлю и спрыгнуть свойство объекта, чтобы получить уникальные значения DateTime?

+2

FWIW, вы упрощаете свой код с помощью linq, но это не значит, что вы на самом деле пропускаете циклы. Linq просто обрабатывает их для вас. – paqogomez

ответ

2

Используйте SelectMany выравниваться списки, затем Select получить раз:

Instruments.SelectMany(kvp => kvp.Value.Bars).Select(b => b.Time).Distinct().ToList(); 

Обратите внимание, что это не какой-либо более эффективным (вы даже не пользуясь ленивым перечисления из-за ToList) , Однако он короче и немного легче читать.

+0

Не забывайте '.Distinct()' как в вопросе. – Haney

+1

@Haney Добавлено, спасибо, что заметили это. – BradleyDotNET

+0

Спасибо. Мне нужно познакомиться со всеми методами linq, помимо Select и Where. Кто-нибудь знает хороший учебник по linq? В настоящее время я усердно учился. –

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