이 문자열이 있습니다. ABCDEFGHIJ
4 번 위치에서 5 번 위치로 바꿔야합니다. ZX
다음과 같이 표시됩니다. ABCZXFGHIJ
하지만 함께 사용하지 마십시오 string.replace("DE","ZX")
-나는 위치 와 함께 사용해야합니다
어떻게하니?
답변
문자열에서 범위를 추가하고 제거하는 가장 쉬운 방법은 StringBuilder
.
var theString = "ABCDEFGHIJ";
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "ZX");
theString = aStringBuilder.ToString();
대안은를 사용하는 String.Substring
것이지만 StringBuilder
코드가 더 읽기 쉬워 진다고 생각합니다 .
답변
string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");
답변
ReplaceAt (int 인덱스, int 길이, 문자열 바꾸기)
다음은 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);
}
이 함수를 사용할 때 전체 대체 문자열이 가능한 한 많은 문자를 대체하도록하려면 길이를 대체 문자열의 길이로 설정하십시오.
"0123456789".ReplaceAt(7, 5, "Hello") = "0123456Hello"
그렇지 않으면 제거 할 문자 수를 지정할 수 있습니다.
"0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789"
길이를 0으로 지정하면이 함수는 삽입 함수처럼 작동합니다.
"0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789"
StringBuilder 클래스를 초기화 할 필요가없고 더 기본적인 작업을 사용하기 때문에 이것이 더 효율적이라고 생각합니다. 내가 틀렸다면 나를 바로 잡으십시오. 🙂
답변
String.Substring()
( 여기에 세부 정보 )를 사용 하여 왼쪽 부분을 자른 다음 교체 한 다음 오른쪽 부분을 자릅니다. 당신이 제대로 될 때까지 인덱스로 재생하십시오 🙂
다음과 같은 것 :
string replacement=original.Substring(0,start)+
rep+original.Substring(start+rep.Length);
답변
확장 방법으로.
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();
}
}
답변
성능에 관심이 있다면 여기서 피하고 싶은 것은 할당입니다. .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));
});
}
이 방법은 다른 방법보다 이해하기 어렵지만 호출 당 하나의 개체 인 새로 생성 된 문자열 만 할당하는 유일한 방법입니다.
답변
string s = "ABCDEFG";
string t = "st";
s = s.Remove(4, t.Length);
s = s.Insert(4, t);