【问题标题】:Modify elements in list with ForEach lambda使用 ForEach lambda 修改列表中的元素
【发布时间】:2015-09-04 03:18:08
【问题描述】:

我要过滤一个字符串数组:

string[] args

从命令行,例如:“-command1 x y -command2 a b -command3 c d”

取所有以'-'开头的单词,然后将它们转换为大写。

var commands = args.Where(x => x.StartsWith("-")).ToList<String>();
commands.ForEach(x => {
    x.ToUpper()
    });
commands.ToString();

这将返回 args 列表,其中包含以“-”小写字母开头的单词 - 即未应用 lambda。为什么是这样?是否为 lambda 捕获制作了一份列表副本,并且该副本已被修改,而不是原始列表本身?

【问题讨论】:

  • 1.您没有将 x.ToUpper() 设置为任何内容。 2. 但即使你这样做了,它也不会编译:字符串是不可变的。你应该这样做:var commands = args.Where(x =&gt; x.StartsWith("-")).Select(x =&gt; x.ToUpper()).ToList();

标签: c# linq


【解决方案1】:
var commands = args.Where(x => x.StartsWith("-")).Select(y => y.ToUpper()).ToList();

var upperCommands = new List<String>();
var commands = args.Where(x => x.StartsWith("-")).ToList<String>();
    commands.ForEach(x => upperCommands.Add(
        x.ToUpper());

【讨论】:

  • 为什么还要提到第二个选项?第一个更简单,更容易阅读。
  • @ataravati :我完全赞同你所说的......提到只是为了让 OP 理解。
  • 没关系,我拿到了第一个。我没有意识到 select 是使用的方法 - 我查看了智能感知列表,出于某种原因,我把它与 where 的行为混淆了,尽管只是使用它!
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 2017-12-12
  • 1970-01-01
相关资源
最近更新 更多