【问题标题】:How can I replace a character in a string using a foreach loop?如何使用 foreach 循环替换字符串中的字符?
【发布时间】:2019-09-11 18:45:39
【问题描述】:

我正在开发一个程序,该程序对要在URL 中使用的字符串进行编码,而无需使用将为我进行编码的库。

想法是一个字符串被传递给这个函数,字符串的每个字符都被迭代。如果字符正常,则将其添加到编码字符串中。如果失败,则对其进行更正,然后将其添加到编码字符串中。我的想法是做多个if/if-else 语句来替换任何坏字符,但我似乎无法弄清楚如何正确地做到这一点。

static string Encode(string value)
{
    string encodedValue = "";
    foreach (char character in value.ToCharArray())
    {
        if(character == ' ')
            value.Replace(character, '%20');
        // Add to encodedValue 
    }
    return encodedValue;
}

显然这不起作用,因为我无法以这种方式将字符替换为大于字符的字符。例如,如何将字符串中的空格替换为代码%20

【问题讨论】:

  • 您不能修改foreach 循环中的任何内容,因为它由语言管理,因此无法预测您所做的更改,您也无法告诉它如何手动预测更改。因此,正如答案所暗示的,您可以克隆和替换克隆中的字符,而不是使用原始字符。请记住,在标准的 for 循环中,您不必担心这一点。

标签: c# foreach char


【解决方案1】:

我不明白是否需要使用foreach 循环,但我们可以直接使用Replace method on String class

value = value.Replace(" ", "%20");

这将使您的字符串值替换为字符串中的空格的 %20。

【讨论】:

  • 如果您只需要更改一个字符,这将是最好的方法,但如果我没有误解这个问题,OP 需要检查许多字符,因此您需要调用 Replace for每个字符都要改变
【解决方案2】:

你可以这样做:

if(character == ' ')
    encodedValue += "%20";
else
    encodedValue += character;

您可以对所有其他所需字符执行相同操作。

【讨论】:

  • 您能解释一下为什么会这样吗?这回答了我的问题,谢谢!
  • 我检查每个字符,如果是要替换的东西,比如空格,我把它的替换添加到encodedValue,否则我添加这个字符。您甚至可以创建两个要替换和替换的字符数组。这样会更有效率。
  • 并且在每个循环中创建一个新字符串。如果此调用在循环内,则会产生大量内存碎片,因为在每个循环中都需要在内存中创建一个新字符串。
  • @Steve 我不这么认为。它是相同的字符串encodedValue
  • 不,+= 将创建一个新字符串,该字符串被重新分配给同一个变量。
【解决方案3】:

首先要说的是字符串是不可变的。对 Replace 的调用会创建一个新字符串,它不会更改输入字符串,因此您需要从 Replace 取回返回值并将其用于以下循环,但是,如果您真的想忽略将执行的现有库这是给你的,那么我认为最好的方法是使用 StringBuilder 来避免在每个循环中创建连续的新字符串。

static string Encode(string value)
{
    StringBuilder encodedValue = new StringBuilder();
    foreach (char character in value.ToCharArray())
    {
        if (character == ' ')
            encodedValue.Append("%20");
        else if(......)
            encodedValue.Append("...");
        else
            encodedValue.Append(character);
    }
    return encodedValue.ToString();
}

【讨论】:

    【解决方案4】:

    您可以使用 LINQ 的 Select 函数。它遍历数组上的每个值并对其应用一个函数,返回一个包含更新值的新数组:

    var charArray = value.ToCharArray();
    var convertedCharArray = charArray.Select((c) => {
        //Here you can apply as many clauses as you like to
        if (c == ' ')
            return "%20";
    
        return c.ToString();
    });
    string encodedValue = string.Join("", convertedCharArray);
    
    return encodedValue;
    

    或者,如果你想单排:

    string encodedValue = string.Join("", value.ToCharArray().Select((c) => {
        //Here you can apply as many clauses as you like to
        if (c == ' ')
            return "%20";
    
        return c.ToString();
    }));
    
    return encodedValue;
    

    PS:永远记得用 string.Join 将你的 char 数组加入一个字符串。我总是忘记它。

    希望有所帮助!

    【讨论】:

    • 实际上,如果我只返回一个字符串,它应该可以工作,所以唯一缺少的是最后一次返回调用的 toString 方法。感谢指出,我会更新我的答案
    猜你喜欢
    • 2015-11-28
    • 2020-09-15
    • 1970-01-01
    • 2017-08-04
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多