문자열의 일부를 위치로 바꾸는 방법은 무엇입니까? 5 번

이 문자열이 있습니다. 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));
        });
}

이 방법은 다른 방법보다 이해하기 어렵지만 호출 당 하나의 개체 인 새로 생성 된 문자열 만 할당하는 유일한 방법입니다.