【问题标题】:Working & Modifying Data In Foreach Cycle? C#在 Foreach 循环中工作和修改数据? C#
【发布时间】:2015-02-04 17:13:32
【问题描述】:

假设我有以下字符串:

  string str = "aaa123aaa";

我将给定的字符串转换为 char 数组:

 char[] array1 = str.ToArray();

然后我想使用 foreach 循环遍历元素以将所有数字更改为空格

foreach (char i in array1)
        {
            if (char.IsNumber(i)) { //   ? }
        }

如何将符合条件的字符更改为空格? 我尝试了以下方法无济于事:

i = ' '; char(i) = ' '; array1(i) = ' ';

它们都不起作用。

我究竟如何与 foreach 循环中的元素进行交互? 如果我使用数组很简单,在这种情况下我会简单地使用:

array1[i] = ' ';

但我不知道如何在 foreach 循环中做同样的事情。

提前谢谢你!

【问题讨论】:

  • 你不想要为只读应用程序设计的foreach,你想使用普通的for循环。
  • 如果要在其中修改集合,请使用 for 循环
  • 请注意,虽然它与modify collection in foreach 非常相似,但它可能会有所不同,因为 OP 需要一种在迭代期间从 item 获取回集合元素的方法。在大多数情况下,明确修改集合会遇到上面链接中介绍的“集合已修改”异常..

标签: c# foreach


【解决方案1】:

如果是 foreach 循环,则无法更改集合的元素 - 但您可以使用 for 循环:

for(int i=0; i < array1.Length; i++)
{
    if (char.IsNumber(array1[i])) { array1[i] = ' ' }
}

请注意,这不会更改原始字符串 - 如果您想这样做,有更有效的方法可以转换为 char 数组。

【讨论】:

  • 从某种意义上说,是的 - foreach 为您提供集合中的每个 item (并且在循环中修改集合的任何尝试通常都会产生异常)
  • @dontseeverysharp - 这是一个非常普遍的概念:您在枚举时无法更改正在枚举的项目。有时它不起作用,有时它会抛出异常。这就是整数增量循环起作用的原因——你永远不会使用你正在修改的数组的枚举数。
  • “不能更改集合的元素”并不完全正确 - 您可以轻松更改数组元素(因为它不像 List&lt;T&gt; 那样具有防止更改元素的保护),但 foreach 可以并没有真正为您提供要更改的项目索引 - 所以for 解决了这两个问题 - 无论集合类型如何,都可以获取索引和安全更新。
【解决方案2】:

您可以使用 for 循环来代替,也可以使用 LINQ

char[] array1 = str.Select(x => char.IsNumber(x) ? ' ' : x).ToArray();

【讨论】:

【解决方案3】:

如果替换很简单,为什么不使用 .NET Regex 类并根据模式替换数字?

string test = "aaa123aaa";
test = Regex.Replace(test, "[0-9]", " ");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多