【问题标题】:How do I convert this double foreach loop to just lambdas?如何将此双 foreach 循环转换为 lambda?
【发布时间】:2012-04-30 04:28:53
【问题描述】:

有没有办法让这些 foreach 循环只需 一个 lambda 表达式?

    private int getNextEventId()
    {
        int numOfEvents = 0;

        foreach (MonthModel eventMonth in eventsForAllMonths)
        {
            foreach (DayModel eventDay in eventMonth.AllDays)
            {
                numOfEvents += eventDay.CalEvents.Count;
            }
        }

        return numOfEvents + 1;
    }

【问题讨论】:

  • 你有没有故意说“只有一个 lambda”?没有人提供“只有一个”的答案......
  • 我不太明白你的问题。但似乎很多人都明白我在问什么:)
  • 你说 ONE lambda,意思是一个 =>

标签: c# linq lambda foreach


【解决方案1】:
int numOfEvents = eventsForAllMonths.SelectMany(m => m.AllDays)
                                    .Select(d => d.CalEvents.Count)
                                    .Sum();

【讨论】:

    【解决方案2】:
    return (eventsForAllMonths.SelectMany(eventMonth => eventMonth.AllDays).Sum(eventDay => eventDay.CalEvents.Count) + 1);
    

    【讨论】:

      【解决方案3】:

      试试这个:

          private int getNextEventId()
          {
              int numOfEvents = eventsForAllMonths.SelectMany(eventMonth => eventMonth.AllDays).Aggregate(0, (current, eventDay) => current + eventDay.CalEvents.Count);
      
              return numOfEvents + 1;
          }
      

      【讨论】:

        【解决方案4】:

        这个怎么样?

        return
            (from m in eventsForAllMonths
            from d in m.AllDays
            select d.CalEvents.Count).Sum() + 1;
        

        【讨论】:

          【解决方案5】:

          我以ForEach()为生,所以:

          eventsForallMonths.ForEach(em=>em.ForEach(ed=>numOfEvents+=ed.CalEvents.Count));
          

          【讨论】:

          • eventsForAllMonths 可能不是List
          • 这可能有效也可能无效,具体取决于 eventsForAllMonths 的类型。 ForEach 仅适用于 List。如果 eventsForAllMonths 是其他内容,则失败。
          • 在 lambda 中像这样修改状态对我来说似乎很恶心。
          • 我不敢相信有人 -1 我 :) OP 想要 LAMBDAS,而你将他推入扩展方法。啧啧
          • eventsForAllMonths 是一个静态列表。这只是为了测试。
          【解决方案6】:

          如何在 lambda 中转换它?

          List<Item> listItem = new List<Item>();
          foreach (StackPanel sp in spPhotos.Children)
          {
              foreach(Item item in sp.Children)
              {
                  listItem.Add(item);
              }
              sp.Children.Clear();
          }
          spPhotos.Children.Clear();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-28
            • 1970-01-01
            • 2014-03-16
            相关资源
            最近更新 更多