.NET 문자열을 자르려면 어떻게합니까?


406

길이가 주어진 값보다 길지 않도록 문자열을 자르고 싶습니다. 데이터베이스 테이블에 쓰고 있는데 작성하는 값이 열 데이터 유형의 제약 조건을 충족하는지 확인하고 싶습니다.

예를 들어, 다음을 쓸 수 있다면 좋을 것입니다.

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}

불행히도 maxLength일반적으로 문자열의 경계를 초과 하기 때문에 예외가 발생 합니다 value. 물론 다음과 같은 함수를 작성할 수는 있지만 이와 같은 것이 이미 존재하기를 희망했습니다.

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 

이 작업을 수행하는 어려운 API는 어디에 있습니까? 하나 있습니까?


24
레코드의 경우 문자열을 변경할 수 없습니다.자를 수 없으며 잘린 사본 만 반환 할 수 있습니다. 닛 피키, 알아
John Weldon

2
@ John Weldon : 멤버 함수가 존재하지 않는 이유 일 것입니다. 데이터 유형의 의미를 따르지 않습니다. 참고로, StringBuilder길이를 짧게하여 잘라낼 수 있지만 문자열 확장을 피하려면 길이 확인을 수행해야합니다.
Steve Guidi

1
어떤 솔루션을 선택하든 Substring을 호출하거나 Length 속성에 액세스하기 전에 null 문자열을 확인해야합니다.
Ray

3
@SteveGuidi-이 경우 비슷한 의미 문제에 직면하는 트림 또는 바꾸기와 같은 기능은 없을 것입니다.
Chris Rogers

1
@JohnWeldon 마이크로 소프트보다 일관되게 이질적인 부분이 있습니다. 예를 들어 .Trim()문자열을 변경하는 것처럼 오도하게 들리는 방식으로 문서화하는 것이 행복 합니다. "앞뒤 공백 문자를 모두 제거합니다 현재 문자열 개체입니다. "
Mark Amery

답변:


620

Truncate()불행히도 문자열 에는 메소드 가 없습니다 . 이런 종류의 논리를 직접 작성해야합니다. 그러나 당신이 할 수있는 일은 이것을 확장 방법으로 감싸서 어디에서나 복제 할 필요가 없습니다.

public static class StringExt
{
    public static string Truncate(this string value, int maxLength)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Length <= maxLength ? value : value.Substring(0, maxLength); 
    }
}

이제 다음과 같이 쓸 수 있습니다 :

var someString = "...";
someString = someString.Truncate(2);

5
훌륭한 솔루션이지만 NET 3.5 이상에서만 작동합니다. NET2.0에서 시도하지 마십시오.
제다이 마스터 스푸키

7
VS 2008 및 VS 2010에있는 한 .Net 2.0을 대상으로하더라도 여전히이 작업을 수행 할 수 있습니다. danielmoth.com/Blog/…
Mark

4
maxLength음수 값이면 실패 합니다.
Bernard

42
@Bernard, maxLength가 음수이면 실패합니다. 다른 행동은 예상치 못한 것입니다.
bojingo

12
널값에서 확장 메소드를 호출 할 수 있습니다.
Joel Malone 1

127

또는 삼항 연산자 대신 Math.min을 사용할 수 있습니다.

public static class StringExt
{
    public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return value.Substring(0, Math.Min(value.Length, maxLength));
    }
}

10
영리한! 그리고 다음 표현식은 원래 문자열에 대한 참조를 반환하도록 최적화되었습니다 value.Substring(0, value.Length).
Steve Guidi

4
불행히도 value.Length가 MaxLength보다 작은 경우에 최적화되어 있지 않으므로 일부 데이터에서 일반적 일 수 있습니다. 또한 문자열의 길이 속성은 대문자 여야합니다.
jpierson

1
maxLength음수 값이면 실패 합니다.
Bernard

7
@ Bernard, 프레임 워크에 많은 것들이있을 것입니다 ...하지만 확인하면 ... 기본적으로 설정해야합니다. maxLength0하거나 value.Length; 또는 ArgumentOutOfRangeException이 경우 더 의미가 있으며 Substring어쨌든 이미 던져졌습니다 .
CaffGeek

2
조금 더 짧은 :return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
user1127860

43

나는 그것이 다른 사람들에 의해 접촉 된 모든 사례를 다루고 여전히 읽을 수있는 간결한 방식으로 그렇게한다고 믿기 때문에 구현을 포기할 것이라고 생각했다.

public static string Truncate(this string value, int maxLength)
{
    if (!string.IsNullOrEmpty(value) && value.Length > maxLength)
    {
        return value.Substring(0, maxLength);
    }

    return value;
}

이 솔루션은 주로 Ray의 솔루션을 하며 LBushkin이 솔루션에서 수행하는 것처럼 this 키워드 를 사용하여 확장 방법으로 사용할 방법을 엽니 다 .


maxLength음수 값이면 실패 합니다.
Bernard

15
@Bernard-maxLength 인수에 음수 값을 전달하지 않는 것이 좋습니다. 예기치 않은 값입니다. Substring 메서드는 동일한 방법을 사용하므로 예외를 개선 할 이유가 없습니다.
jpierson

IsNullOrEmpty 확인이 필요하다고 생각하지 않습니까? (1) value가 null 인 경우이 확장 메서드를 호출 할 방법이 없어야합니다. (2) value가 빈 문자열이면 value.Length> maxLength check가 실패합니다.
Jon Schneider

8
@JonSchneider, 확장 방법이므로 IsNullOrEmpty가 필요합니다. null로 지정된 string 유형의 변수가있는 경우 컴파일러는이 메소드를 호출하기 전에 널 검사를 삽입하지 않습니다. 기술적으로 이것은 여전히 ​​정적 클래스의 정적 메소드입니다. 따라서 : stringVar.Truncate (2) 다음과 같이 컴파일합니다. StringExt.Truncate (stringVar, 2);
Jeff B

40

성능 테스트가 재미 있기 때문에 : ( linqpad 확장 방법 사용 )

var val = string.Concat(Enumerable.Range(0, 50).Select(i => i % 10));

foreach(var limit in new[] { 10, 25, 44, 64 })
    new Perf<string> {
        { "newstring" + limit, n => new string(val.Take(limit).ToArray()) },
        { "concat" + limit, n => string.Concat(val.Take(limit)) },
        { "truncate" + limit, n => val.Substring(0, Math.Min(val.Length, limit)) },
        { "smart-trunc" + limit, n => val.Length <= limit ? val : val.Substring(0, limit) },
        { "stringbuilder" + limit, n => new StringBuilder(val, 0, Math.Min(val.Length, limit), limit).ToString() },
    }.Vs();

truncate방법은 "상당히"빨랐습니다. # 미세 최적화

이른

  • truncate10 5788 틱 경과 (0.5788ms) [10K 반복, 5.788E-05ms 당]
  • smart-trunc10 8206 틱 경과 (0.8206ms) [10K 반복, 8.206E-05ms / 초]
  • stringbuilder10 10557 틱 경과 (1.0557ms) [10K 반복, 0.00010557ms 당]
  • concat10 45495 틱 경과 (4.5495ms) [10K 반복, 0.00045495ms 당]
  • newstring10 72535 틱 경과 (7.2535ms) [10K 반복, 0.00072535ms]

늦은

  • truncate44 8835 틱 경과 (0.8835ms) [10K 반복, 8.835E-05ms 당]
  • stringbuilder44 13106 틱 경과 (1.3106ms) [10K 반복, 0.00013106ms 당]
  • smart-trunc44 14821 틱 경과 (1.4821ms) [10K 반복, 0.00014821ms 당]
  • newstring44 144324 틱 경과 (14.4324ms) [10K 반복, 0.00144324ms 당]
  • concat44 174610 틱 경과 (17.461ms) [10K 반복, 0.0017461ms / 초]

너무 오래

  • smart-trunc64 6944 틱 경과 (0.6944ms) [10K 반복, 6.944E-05ms 당]
  • truncate64 7686 틱 경과 (0.7686ms) [10K 반복, 7.686E-05ms 당]
  • stringbuilder64 13314 틱 경과 (1.3314ms) [10K 반복, 0.00013314ms 당]
  • newstring64 177481 틱 경과 (17.7481ms) [10K 반복, 0.00177481ms 당]
  • concat64 241601 틱 경과 (24.1601ms) [10K 반복, 0.00241601ms 당]

유용한 벤치 마크에 감사드립니다! ... 그리고 링크 패드 바위!
Sunsetquest

linqpad 그 일을 할 수있는 마음 결코
jefissu

38

.NET 4.0에서는 다음 Take방법을 사용할 수 있습니다 .

string.Concat(myString.Take(maxLength));

효율성을 테스트하지 않았습니다!


27

LINQ를 사용할 수 있습니다 ... 문자열 길이를 확인할 필요가 없습니다. 아마도 가장 효율적이지는 않지만 재미 있습니다.

string result = string.Join("", value.Take(maxLength)); // .NET 4 Join

또는

string result = new string(value.Take(maxLength).ToArray());

2
이것이 왜 대답이 아닌가? 당신이 / 문서 또는 .Take 등에서를 내장하여 어떤 유지해야한다는 자신의 확장 방법을 작성, 정직하고 대부분의
돈 치들

9
@mmcrae Linq는 더 직설적이지만 속도도 훨씬 느립니다. 내 벤치 마크는 Linq의 경우 ~ 400ms이고 백만 번 반복하면 Substring의 경우 ~ 24ms입니다.
Hein Andre Grønnestad 2012 년

이 솔루션은 절대 사용해서는 안됩니다. 위의 두 의견에서 언급했듯이 기존 문자열이 최대 길이보다 크지 않은 경우에도 항상 메모리 할당이 있습니다. 또한 매우 느립니다.
Kamarey

15

나는 이런 식으로 한 줄로 내 것을 했어

value = value.Length > 1000 ? value.Substring(0, 1000) : value;

2
-1; 이것은 이미 받아 들여진 대답에 없었던 것을 전혀 추가하지 않습니다.
Mark Amery

2
@markamery 필요할 때 작성하고 업데이트하는 코드가 적은 짧은 대안입니다. 마음에 들지 않습니까? 사용하지 마십시오
SeanMC

빠르고 간단하며 빠릅니다. 이것이 내가 필요한 것입니다. 감사!
Peter

14

아직 아무도 이것을 게시하지 않았습니다 :

public static class StringExt
{
    public static string Truncate(this string s, int maxLength)
    {
        return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s;
    }
}

&& 연산자를 사용하면 허용되는 답변보다 약간 더 좋습니다.


13

.NET Framework에는 다음과 같은 문자열을 자르는 API가 있습니다.

Microsoft.VisualBasic.Strings.Left(string, int);

그러나 C # 앱에서는 주요 raison d' etre가 이전 버전과의 호환성 인 Microsoft.VisualBasic.dll에 대한 종속성을 얻는 것보다 자신의 롤을 선호 할 것입니다.


".NET Framework에는 API가 있습니다." 즉, VB.NET의 API입니다
카밀로 Terevinto

9
@CamiloTerevinto-.NET Framework와 함께 제공되는 API이며 모든 관리 언어에서 호출 할 수 있습니다.
Joe

1
VB DLL에는 많은 장점이 있습니다. 왜 많은 C # 개발자가 이에 반대합니까?
Michael Z.

불행히도 현재 .NET Core는 지원되지 않습니다. 실제로 Microsoft.VisualBasic.Strings.NET Core 의 전체 모듈은 매우 비어 있습니다.
Mark Amery

1
나는 Joe의 의견에 동의하지만 여전히 다른 언어에서 VB에 특정한 것을 부르는 것이 옳지 않습니다. "VB DLL"에 너무 많은 것들이 있다면, 그것을 공유 장소에 두지 않겠습니까? 내일 Microsoft가이 일들을 어떻게 할 것인지 누가 알겠습니까? 지원 또는 무언가를 중지하십시오.
Kamarey


6

나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에 좋은 해결책이 있습니다.

public static string Truncate(this string text, int maxLength, string suffix = "...")
{
    string str = text;
    if (maxLength > 0)
    {
        int length = maxLength - suffix.Length;
        if (length <= 0)
        {
            return str;
        }
        if ((text != null) && (text.Length > maxLength))
        {
            return (text.Substring(0, length).TrimEnd(new char[0]) + suffix);
        }
    }
    return str;
}

var myString = "hello world"
var myTruncatedString = myString.Truncate(4);

반품 : 안녕하세요 ...


@SarjanWebDev이 특수 문자는 "."로 나타납니다. cmd.exe
Neal Ehardt

5

C # 6의 널 전파 연산자와 유사한 변형

public static string Truncate(this string value, int maxLength)
{
    return value?.Length <= maxLength ? value : value?.Substring(0, maxLength);
}

기본적으로 valuenull이 두 번 있는지 확인하고 있습니다.


5

C # 문자열에 대해서는 2016 년에 여전히 자르기 방법이 없습니다. 그러나 C # 6.0 구문 사용 :

public static class StringExtension
{
  public static string Truncate(this string s, int max) 
  { 
    return s?.Length > max ? s.Substring(0, max) : s ?? throw new ArgumentNullException(s); 
  }
}

그것은 매력처럼 작동합니다.

"Truncate me".Truncate(8);
Result: "Truncate"

4

@CaffGeek를 가져 와서 단순화하십시오.

public static string Truncate(this string value, int maxLength)
    {
        return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
    }

4

끈을 자르는 것은 단지 지정된 길이로만 끈을 자르는 것만을 의미하는 것이 아니라 단어를 나누지 않도록주의해야한다는 점에 유의하십시오.

예를 들어 문자열 : 이것은 테스트 문자열입니다.

11시에 자르고 싶습니다. 위에 주어진 방법 중 하나를 사용하면 결과는

이것은 테입니다

이것은 우리가 원하는 것이 아닙니다

내가 사용하는 방법도 완벽하지는 않지만 대부분의 상황을 처리 할 수 ​​있습니다.

public string CutString(string source, int length)
{
        if (source== null || source.Length < length)
        {
            return source;
        }
        int nextSpace = source.LastIndexOf(" ", length);
        return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
} 

4

왜 안되 겠어요 :

string NormalizeLength(string value, int maxLength)
{
    //check String.IsNullOrEmpty(value) and act on it. 
    return value.PadRight(maxLength).Substring(0, maxLength);
}

즉, 이벤트 value.Length < maxLength패드 공간에서 끝까지 또는 초과를 자릅니다.


문자열 개체의 두 배를 생성하고 value가 null 인 경우 PadRight 호출에서 NullReferenceException을 발생시킬 수 있으며 ArgumentNullException이어야합니다.
Jeremy

1
@Jeremy 나는 "값이 null이면 PadRight 호출에서 NullReferenceException을 던질 수있다"는 것을 이해하지 못한다; "// check string.IsNullOrEmpty (value)에 대해 언급하지 않았으며 이에 대해 조치하십시오."
Sri

3

여기에 충분한 답변이없는 경우 여기에 내 것이 있습니다 :)

public static string Truncate(this string str, 
                              int totalLength, 
                              string truncationIndicator = "")
{
    if (string.IsNullOrEmpty(str) || str.Length < totalLength) 
        return str;

    return str.Substring(0, totalLength - truncationIndicator.Length) 
           + truncationIndicator;
}

쓰다:

"I use it like this".Truncate(5,"~")

2

복잡성을 줄이기 위해 maxLength 매개 변수와 관련하여 마지막 3자를 줄임표로 바꾸는 오버로드 된 버전을 추가합니다.

public static string Truncate(this string value, int maxLength, bool replaceTruncatedCharWithEllipsis = false)
{
    if (replaceTruncatedCharWithEllipsis && maxLength <= 3)
        throw new ArgumentOutOfRangeException("maxLength",
            "maxLength should be greater than three when replacing with an ellipsis.");

    if (String.IsNullOrWhiteSpace(value)) 
        return String.Empty;

    if (replaceTruncatedCharWithEllipsis &&
        value.Length > maxLength)
    {
        return value.Substring(0, maxLength - 3) + "...";
    }

    return value.Substring(0, Math.Min(value.Length, maxLength)); 
}

2

예제 길이가 30 인 내 2 센트 :

  var truncatedInput = string.IsNullOrEmpty(input) ? 
      string.Empty : 
      input.Substring(0, Math.Min(input.Length, 30));

1

jpierson의 답변을 선호하지만 여기서 볼 수있는 예제 중 maxLength <0과 같은 잘못된 maxLength 매개 변수를 처리하는 예제는 없습니다.

try / catch에서 오류를 처리하거나 maxLength 매개 변수 min을 0으로 고정하거나 maxLength가 0보다 작 으면 빈 문자열을 반환합니다.

최적화되지 않은 코드 :

public string Truncate(this string value, int maximumLength)
{
    if (string.IsNullOrEmpty(value) == true) { return value; }
    if (maximumLen < 0) { return String.Empty; }
    if (value.Length > maximumLength) { return value.Substring(0, maximumLength); }
    return value;
}

3
내 구현에서 maximumLength가 0보다 작은 경우를 처리하지 않기로 선택했습니다. 왜냐하면 내가 할 유일한 일은 ArgumentOutOfRangeExcpetion을 던지는 것입니다.
jpierson

1

다음은 vb.net 솔루션입니다. 문자열이 이미 maxlength보다 작을 때 하위 문자열 문이 필요하지 않기 때문에 if (추악한) 문이 성능을 향상 시킨다는 점을 표시하십시오 ... 문자열의 확장으로 사용하기 쉽습니다. ..

 <System.Runtime.CompilerServices.Extension()> _
    Public Function Truncate(String__1 As String, maxlength As Integer) As String
        If Not String.IsNullOrEmpty(String__1) AndAlso String__1.Length > maxlength Then
            Return String__1.Substring(0, maxlength)
        Else
            Return String__1
        End If
    End Function

VB.net에서 "Not String.IsNullOrEmpty (String__1)"을 "String__1 <> Nothing"으로 바꿀 수 있습니다. 조금 더 짧습니다. 문자열의 기본값은 빈 문자열입니다. "<> Nothing"을 사용하면 null과 빈 문자열을 모두 확인합니다. Truncate ( "", 50) 및 Truncate (Nothing, 50)
jrjensen

VB에서는 Left (string, maxlength)
Michael Z가 가능합니다.

1

나는 이미 많은 대답이 있다는 것을 알고 있지만 문자열의 시작과 끝을 그대로 유지하면서 최대 길이 이하로 줄이려고했습니다.

    public static string TruncateMiddle(string source)
    {
        if (String.IsNullOrWhiteSpace(source) || source.Length < 260) 
            return source;

        return string.Format("{0}...{1}", 
            source.Substring(0, 235),
            source.Substring(source.Length - 20));
    }

최대 길이가 260자인 SharePoint URL을 만들기위한 것입니다.

상수 260이므로 길이를 매개 변수로 만들지 않았습니다. 또한 특정 지점에서 끊기를 원하기 때문에 첫 번째 하위 문자열 길이를 매개 변수로 만들지 않았습니다. 마지막으로 두 번째 하위 문자열은 폴더 구조를 알고 있기 때문에 소스의 길이입니다.

이는 특정 요구에 쉽게 적용 할 수 있습니다.


1

나는 이미 여기에 많은 대답이 있다는 것을 알고 있지만 이것은 내가 가지고있는 것입니다. 널 문자열과 길이가 음수 인 상황을 모두 처리합니다.

public static string Truncate(this string s, int length)
{
    return string.IsNullOrEmpty(s) || s.Length <= length ? s 
        : length <= 0 ? string.Empty 
        : s.Substring(0, length);
}

1

C # 8에서는 새로운 범위 기능을 사용할 수 있습니다 ...

value = value[..Math.Min(30, value.Length)];

0

내가 알고있는 이것에 대한 .net에는 아무것도 없습니다-여기에 "..."를 추가하는 내 버전이 있습니다 :

public static string truncateString(string originalString, int length) {
  if (string.IsNullOrEmpty(originalString)) {
   return originalString;
  }
  if (originalString.Length > length) {
   return originalString.Substring(0, length) + "...";
  }
  else {
   return originalString;
  }
}

2
버전은 잘린 경우를 위해 요청 된 길이보다 3 자 긴 문자열을 제공합니다. 게다가 트리플 도트는 표현상 의미가 있습니다. OP가 준 유스 케이스와 같은 데이터베이스에는 저장하지 않습니다.
MarioDS

0

자르기 문자열

public static string _TruncateString(string input, int charaterlimit)
{
    int characterLimit = charaterlimit;
    string output = input;

    // Check if the string is longer than the allowed amount
    // otherwise do nothing
    if (output.Length > characterLimit && characterLimit > 0)
    {
        // cut the string down to the maximum number of characters
        output = output.Substring(0, characterLimit);
        // Check if the character right after the truncate point was a space
        // if not, we are in the middle of a word and need to remove the rest of it
        if (input.Substring(output.Length, 1) != " ")
        {
            int LastSpace = output.LastIndexOf(" ");

            // if we found a space then, cut back to that space
            if (LastSpace != -1)
            {
                output = output.Substring(0, LastSpace);
            }
        }
        // Finally, add the "..."
        output += "...";
    }
    return output;
}

2
왜 공개 메소드 이름 앞에 밑줄을 표시합니까?
Michael Z.

0

위에서 논의한 가능성에 더하여 솔루션을 공유하고 싶습니다. 그것은 null을 허용하는 확장 메소드입니다 (string.Empty를 반환) 또한 줄임표와 함께 사용하기위한 두 번째 .Truncate ()가 있습니다. 성능이 최적화되지 않았습니다.

public static string Truncate(this string value, int maxLength) =>
    (value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
    string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);

-1
public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return new string(value.Take(maxLength).ToArray());// use LINQ and be happy
    }

여기서의 ToArray()호출은 불필요한 오버 헤드입니다. 예를 들어 String.Concat배열을 거치지 않고 열거 가능한 문자로 문자열을 만들 수 있습니다.
Mark Amery

-3

문자열 자르기

public static string TruncateText(string strText, int intLength)
{
    if (!(string.IsNullOrEmpty(strText)))
    {                                
        // split the text.
        var words = strText.Split(' ');

        // calculate the number of words
        // based on the provided characters length 
        // use an average of 7.6 chars per word.
        int wordLength = Convert.ToInt32(Math.Ceiling(intLength / 7.6));

        // if the text is shorter than the length,
        // display the text without changing it.
        if (words.Length <= wordLength)
            return strText.Trim();                

        // put together a shorter text
        // based on the number of words
        return string.Join(" ", words.Take(wordLength)) + " ...".Trim();
    }
        else
        {
            return "";
        }            
    }

이것은 OP의 질문에 대답하지 않습니다. 먼저, 멤버 함수 여야합니다 (확장 메소드로 작성 했더라도). 둘째, OP는 텍스트를 분할하고 단어를 약으로 자르도록 지정하지 않습니다. 단어 당 7.6 자
Wicher Visser

7.6은 숫자입니다. 원하는 다른 번호를 쓸 수 있습니다. 이것은 평균 영어 단어 길이였습니다. Google에서 찾았습니다. split을 사용하면 단어를 공간별로 쉽게 분류 할 수 있습니다. 나는 당신이 반 단어를 표시하고 싶지 않다고 생각합니다! 따라서 더 많은 코드가 필요한 빈 공간을 찾기 위해 반복하지 않으면 문자열을 자르고 전체 단어를 표시하는 쉬운 방법입니다. 이렇게하면 문자열이 주어진 길이보다 길지 않고 단어가 깨지지 않습니다.
VT

-4

이것은 내가 일반적으로 사용하는 코드입니다.

string getSubString(string value, int index, int length)
        {
            if (string.IsNullOrEmpty(value) || value.Length <= length)
            {
                return value;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = index; i < length; i++)
            {
                sb.AppendLine(value[i].ToString());
            }
            return sb.ToString();
        }

5
+ =로 문자열을 연결하면 특히 문자별로 재구성 할 때 비용이 많이 드는 작업입니다. .NET 문자열은 변경할 수 없으므로이 경우 루프에서 매번 새 문자열이 생성됩니다.
Steve Guidi

@SteveGuidi 문자열은 변경할 수 없으며 변경 불가능한 것으로 가장합니다. 문자열이 진정한 불변의 프리미티브이기를 원하므로 문자열과 문자열을 가질 수 있습니까?
Chris Marisic

성능 비용이 중요한 것처럼 비싸다고 말하면 stringBuilder를 사용하도록 변경했지만 + =로 진행 상황을 쉽게 볼 수 있다는 것을 알았습니다. OP가 코드를 쉽게 이해하기를 원했습니다.
user3390116
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.