Linq IEnumerable Вопрос о выборе - Могу ли я сделать все это внутри моего выбора? - PullRequest
0 голосов
/ 08 июля 2010

У меня был быстрый вопрос. Могу ли я сделать всю эту логику внутри оператора select?

 var entries = atisDAO.GetPME(xl, null);
 response.Data.Detectors = new List<DetectorDetails>(entries.Select(pme => new DetectorDetails {ID = pme.PlaceNum.ToString()}));
 if(response.Data.Detectors.Any())
 {
   response.Data.Detectors.ForEach(d =>{
      int id;
      if(int.TryParse(d.ID, out id))
      {
         var summaries = atisDAO.GetSummaryEntries(id);
         if (summaries.Any())
         {
             var count = summaries.Sum(summary => summary.TODCount + summary.BFICount + summary.ViolationCount);
             var detectionDate = summaries.Max(summary => summary.ReadDate);

             d.Count = count.ToString();
             d.DetectionTime = new DateTimeZone {
                  ReadDate = detectionDate.ToString(DATE_FORMAT)
                , ReadTime = detectionDate.ToString(TIME_FORMAT)
             };
           }
         }
     });
 }

Неправильно делать выбор, затем перебирать список и изменять только что выбранные элементы Могу ли я сделать все это внутри оператора select?

Спасибо за любые советы.

Приветствия
~ ck в Сан-Диего

Ответы [ 3 ]

1 голос
/ 08 июля 2010

Конечно, а почему нет? Что мешает вам изменить новый DetectorDetails с помощью кода из ForEach в операторе Select?

0 голосов
/ 08 июля 2010

Я понял это. Мне нужно было выражение возврата в моей проекции.

var entries = atisDAO.GetPME(xl, null);
response.Data.Detectors = new List<DetectorDetails>(entries.Select(pme =>{
    var details = new DetectorDetails { ID = pme.PlaceNum.ToString()};
    var summaries = atisDAO.GetSummaryEntries(pme.PlaceNum);
    if (summaries.Any())
    {
        var count = summaries.Sum(summary => summary.TODCount + summary.BFICount + summary.ViolationCount);
        var detectionDate = summaries.Max(summary => summary.ReadDate);

        details.Count = count.ToString();
        details.DetectionTime = new DateTimeZone {
            ReadDate = detectionDate.ToString(DATE_FORMAT)
            , ReadTime = detectionDate.ToString(TIME_FORMAT)
        };
     }

     return details;
}));
0 голосов
/ 08 июля 2010

Помогает ли это вам туда, куда вы идете?Я не могу быть уверен, что все типы данных совпадают и будут скомпилированы как есть, но это попытка поместить всю эту логику в .Select().Конечно, это может быть улучшено, чтобы стать лучше!Не стесняйтесь редактировать этот ответ, чтобы он работал лучше.

 response.Data.Detectors = atisDAO.GetPME(xl, null).Select(pme =>
                new DetectorDetails{
                                    ID = pme.PlaceNum.ToString(),
                                    Count = atisDAO.GetSummaryEntries(int.Parse(pme.PlaceNum.ToString())).Count(), //some work needed here to ensure pme.PlaceNum is actually an number 
                                    DetectionTime = new DateTimeZone{
                                        ReadDate = summaries.Max(summary => summary.ReadDate).ToString(DATE_FORMAT),
                                        ReadTime = summaries.Max(summary => summary.ReadDate).ToString(TIME_FORMAT)
                                    }
                                  }
 );
...