【问题标题】:Linq IEnumerable Select Question - Can I do all of this inside my select?Linq IEnumerable Select 问题 - 我可以在我的选择中完成所有这些操作吗?
【发布时间】:2011-03-13 10:26:08
【问题描述】:

我有一个简短的问题。我可以在 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 在圣地亚哥

【问题讨论】:

    标签: c# linq select ienumerable object-initializers


    【解决方案1】:

    当然,为什么不呢?是什么阻止您在 Select 语句中使用 ForEach 中的代码更改新的 DetectorDetails?

    【讨论】:

    • 我的语法不正确。 Visual Studio 一直对我咆哮。
    【解决方案2】:

    这是否有助于您到达目的地?我不能确定数据类型是否全部匹配并且会按原样编译,但这是将所有逻辑放入您的.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)
                                        }
                                      }
     );
    

    【讨论】:

      【解决方案3】:

      我想通了。我的投影中需要一个 return 语句。

      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;
      }));
      

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多