Gal*_*ali 143 c# string replace
我有这个字符串: ABCDEFGHIJ
我需要用字符串从位置4替换到位置5 ZX
它看起来像这样: ABCZXFGHIJ
但不要使用string.replace("DE","ZX")- 我需要使用位置
我该怎么做?
Alb*_*nbo 185
在字符串中添加和删除范围的最简单方法是使用StringBuilder.
var theString = "ABCDEFGHIJ";
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "ZX");
theString = aStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用String.Substring,但我认为StringBuilder代码更具可读性.
V4V*_*tta 169
string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");
Run Code Online (Sandbox Code Playgroud)
Nic*_*ler 40
这是一个不使用StringBuilder或Substring的扩展方法.此方法还允许替换字符串延伸超过源字符串的长度.
//// str - the source string
//// index- the start location to replace at (0-based)
//// length - the number of characters to be removed before inserting
//// replace - the string that is replacing characters
public static string ReplaceAt(this string str, int index, int length, string replace)
{
return str.Remove(index, Math.Min(length, str.Length - index))
.Insert(index, replace);
}
Run Code Online (Sandbox Code Playgroud)
使用此函数时,如果希望整个替换字符串替换尽可能多的字符,则将length设置为替换字符串的长度:
"0123456789".ReplaceAt(7, 5, "Hello") = "0123456Hello"
Run Code Online (Sandbox Code Playgroud)
否则,您可以指定要删除的字符数量:
"0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789"
Run Code Online (Sandbox Code Playgroud)
如果指定长度为0,则此函数的作用与插入函数类似:
"0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789"
Run Code Online (Sandbox Code Playgroud)
我想这更有效,因为StringBuilder类不需要初始化,因为它使用更多的基本操作.如果我错了,请纠正我.:)
使用String.Substring()(此处详细信息)剪切左侧部分,然后更换,然后右侧部分.玩索引,直到你正确:)
就像是:
string replacement=original.Substring(0,start)+
rep+original.Substring(start+rep.Length);
Run Code Online (Sandbox Code Playgroud)
如果您关心性能,那么您在这里要避免的是分配。如果您使用的是 .Net Core 2.1+(或尚未发布的 .Net Standard 2.1),那么您可以使用以下string.Create方法:
public static string ReplaceAt(this string str, int index, int length, string replace)
{
return string.Create(str.Length - length + replace.Length, (str, index, length, replace),
(span, state) =>
{
state.str.AsSpan().Slice(0, state.index).CopyTo(span);
state.replace.AsSpan().CopyTo(span.Slice(state.index));
state.str.AsSpan().Slice(state.index + state.length).CopyTo(span.Slice(state.index + state.replace.Length));
});
}
Run Code Online (Sandbox Code Playgroud)
这种方法比其他方法更难理解,但它是唯一一种每次调用只分配一个对象的方法:新创建的字符串。
作为一种扩展方法.
public static class StringBuilderExtension
{
public static string SubsituteString(this string OriginalStr, int index, int length, string SubsituteStr)
{
return new StringBuilder(OriginalStr).Remove(index, length).Insert(index, SubsituteStr).ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
string s = "ABCDEFG";
string t = "st";
s = s.Remove(4, t.Length);
s = s.Insert(4, t);
Run Code Online (Sandbox Code Playgroud)