【问题标题】:Change foreach loop to lambda [duplicate]将 foreach 循环更改为 lambda [重复]
【发布时间】:2012-12-27 14:46:57
【问题描述】:

可能重复:
C# Syntax - Example of a Lambda Expression - ForEach() over Generic List

我想简化我的代码并将其更改为更短且仍然可读的代码。

List<string> onlineModelsNumbers = new List<string>();

foreach (OnlineModel om in OnlineModels)
    onlineModelsNumbers.Add(om.model_id.ToString());

在这里,我正在考虑在 lambda 表达式中编写相同的内容。但是我该怎么做呢?

List<string> onlineModelsNumbersL = onlineModelsNumbers.ForEach(...)

List<string> onlineModelsNumbersL = new List<string>(onlineModelsNumbers.ForEach(...))

还有其他建议吗?

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:
    List<string> onlineModelsNumbers = OnlineModels.Select(om => om.model_id.ToString()).ToList();
    

    【讨论】:

    • 如果你想要一个 List,你需要调用 ToList()。
    • 刚刚看到您发布的内容。谢谢。 :-)
    【解决方案2】:

    怎么样:

    onlineModelsNumbers.AddRange(OnlineModels.Select(o => o.model_id.ToString());
    

    【讨论】:

      【解决方案3】:
      var onlineModelsNumbers = OnlineModels.Select(m => m.model_id.ToString())
                                            .ToList();
      

      【讨论】:

        【解决方案4】:

        LINQ purposely does not come with a ForEach extension(使 LINQ 函数保持纯正),但很容易编写自己的包装 foreach

        【讨论】:

        • 它确实带有列表的 ForEach 扩展......
        【解决方案5】:

        您的代码已经很简单了。您可以考虑使用隐式类型的循环变量:

        foreach(var om in OnlineModels)
        {
            onlineModelNumbers.Add(om.model_id.ToString());
        }
        

        或者你可以使用AddRange:

        onlineModelNumbers.AddRange(OnlineModels.Select(om => om.model_id.ToString()));
        

        【讨论】:

          【解决方案6】:

          您在这里不需要 foreach,select 会为您完成:

          IEnumerable<string> = OnlineModels.Select(x => x.model_id.ToString());
          

          【讨论】:

            【解决方案7】:

            只需转换并将其添加为范围:

            List<string> onlineModelsNumbers = new List<string>(OnlineModels.Select(om => om.model_id.ToString()));
            

            【讨论】:

              【解决方案8】:

              您希望对 OnlineModels 的每个成员执行“foreach”,因此希望将模型的 model_id 字符串表示形式添加到 onlineModelsNumbers。

              我希望将表达式写成如下:

              onlineModels.ForEach(om => onlineModelsNumbers.Add(om.model_id.ToString()))
              

              【讨论】:

              • 这是相当糟糕的做法,因为您正在导致并且还依赖于函数式样式调用的副作用。最好使用AddRangeToList 来避免这种情况。
              猜你喜欢
              • 2012-01-03
              • 1970-01-01
              • 2020-08-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多