linq — преобразование вложенного цикла foreach

#linq

#linq

Вопрос:

Возникли проблемы при попытке преобразовать foreach цикл в linq:

 IList<DateTime> dicommentdates = new List<DateTime>();

foreach (DiaryEntry dEnt in DiaryEntries)
{
    if (dEnt.EnteredInYearGroup == this.YearGroup)
    {
        foreach (DiaryEntryComment dcom in dEnt.DiaryEntryComments)
        {
            //add all the comments for this year group
            dicommentdates.Add(dcom.DateEntered);
        }
    }
}
  

Любая помощь очень ценится.

Ответ №1:

Попробуйте это:

 List<DateTime> diCommentDates = DiaryEntries.Where(dEnt => dEnt.EnteredInYearGroup == this.YearGroup)
                                            .SelectMany(dEnt => dEnt.DiaryEntryComments)
                                            .Select(dCom => dCom.DateEntered)
                                            .ToList();
  

Комментарии:

1. var commentDate = this . DiaryEntries . Где(de => de.EnteredInYearGroup == this. Группа лет) . Выберите MANY(com => com. DiaryEntryComments) . Выберите(cd => cd.DateEntered) .DefaultIfEmpty() .Max(); возвращает commentDate; Да, спасибо, в итоге я изменил его, чтобы найти последнюю дату. Спасибо

Ответ №2:

  IList<DateTime> dicommentdates = DiaryEntries
               .Where( x=> x.EnteredInYearGroup == this.YearGroup)
               .SelectMany(x => x.DiaryEntryComments)
               .Select(x => x.DateEntered)
               .ToList()
  

Ответ №3:

Это должно сделать это:

 IList<DateTime> dicommentdates =
    (
        from dEnt in DiaryEntries
        where dEnt.EnteredInYearGroup == this.YearGroup
        from dcom in dEnt.DiaryEntryComments
        select dcom.DateEntered
    ).ToList();
  

Ответ №4:

Должно работать следующее:

 dicommentdates.AddRange(
   DiaryEntries.Where(dEnt => dEnt.EnteredInYearGroup == this.YearGroup)
   .SelectMany(dEnt => dEnt.DiaryEntryComments)).Select(dcom=> dcom.DateEntered);
  

Ответ №5:

Я полагаю, что простейшей формой было бы:

 var dates = 
    from entry in DiaryEntries 
    where entry.YearGroup == YearGroup 
    select entry.DiaryEntryComments.DateEntered;
  

Комментарии:

1. var commentDate = this . DiaryEntries . Где(de => de.EnteredInYearGroup == this. Группа лет) . Выберите MANY(com => com. DiaryEntryComments) . Выберите(cd => cd.DateEntered) .DefaultIfEmpty() .Max(); возвращает commentDate; Я использовал его, чтобы вернуть только максимальное значение, поэтому в итоге получил это. Спасибо.