用字符串替换给定索引处的char?

时间:2012-02-20 19:21:52

标签: c# string

字符串没有ReplaceAt(),而且我在如何制作能够满足我需要的功能的方面有点笨拙。我认为CPU成本很高,但字符串大小很小所以一切正常

7 个答案:

答案 0 :(得分:200)

使用StringBuilder

StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();

答案 1 :(得分:79)

最简单的方法类似于:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    char[] chars = input.ToCharArray();
    chars[index] = newChar;
    return new string(chars);
}

现在这是一种扩展方法,您可以使用:

var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo

想到某种方式只需要一个单个数据副本而不是这里的两个副本会很好,但我不确定是否有任何做法那。它可以可能这样做:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    StringBuilder builder = new StringBuilder(input);
    builder[index] = newChar;
    return builder.ToString();
}

...我怀疑这完全取决于您使用的框架版本。

答案 2 :(得分:23)

string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);

答案 3 :(得分:5)

我突然需要完成这项任务并找到了这个主题。 所以,这是我的linq风格变体:

public static class Extensions
{
    public static string ReplaceAt(this string value, int index, char newchar)
    {
        if (value.Length <= index)
            return value;
        else
            return string.Concat(value.Select((c, i) => i == index ? newchar : c));
    }
}

然后,例如:

string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');

最后我需要使用.Net Framework 2,所以我使用StringBuilder类变体。

答案 4 :(得分:4)

字符串是不可变对象,因此您无法替换字符串中的给定字符。 你可以做的是你可以创建一个替换了给定角色的新字符串。

但是如果你要创建一个新字符串,为什么不使用StringBuilder:

string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();

//newS = "axc";

答案 5 :(得分:0)

如果您的项目(.csproj)允许不安全的代码,那么这是更快的解决方案:

namespace System
{
  public static class StringExt
  {
    public static unsafe void ReplaceAt(this string source, int index, char value)
    {
        if (source == null)
            throw new ArgumentNullException("source");

        if (index < 0 || index >= source.Length)
            throw new IndexOutOfRangeException("invalid index value");

        fixed (char* ptr = source)
        {
            ptr[index] = value;
        }
    }
  }
}

您可以将它用作 String 对象的扩展方法。

答案 6 :(得分:-3)

public string ReplaceChar(string sourceString, char newChar, int charIndex)
    {
        try
        {
            // if the sourceString exists
            if (!String.IsNullOrEmpty(sourceString))
            {
                // verify the lenght is in range
                if (charIndex < sourceString.Length)
                {
                    // Get the oldChar
                    char oldChar = sourceString[charIndex];

                    // Replace out the char  ***WARNING - THIS CODE IS WRONG - it replaces ALL occurrences of oldChar in string!!!***
                    sourceString.Replace(oldChar, newChar);
                }
            }
        }
        catch (Exception error)
        {
            // for debugging only
            string err = error.ToString();
        }

        // return value
        return sourceString;
    }