String 클래스의 어떤 메소드가 첫 번째 N 문자 만 반환합니까?


184

String입력 문자열이 제공된 길이보다 길면 N첫 번째 N문자 만 표시 되도록 클래스에 확장 메소드를 작성하고 싶습니다 .

그 모습은 다음과 같습니다.

public static string TruncateLongString(this string str, int maxLength)
{
    if (str.Length <= maxLength)
        return str;
    else
        //return the first maxLength characters                
}

String.*()N문자 만 얻기 위해 어떤 방법을 사용할 수 str있습니까?

답변:


374
public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str))
        return str;
    return str.Substring(0, Math.Min(str.Length, maxLength));
}

6
Math.Min이 필요합니까? Substring이 두 번째 매개 변수가 길이보다 길면 길이에 연결되었다는 것을 알고 있다고 생각했습니다.
Martin

12
System.String.InternalSubStringWithChecks는 ArgumentOutOfRange를 던질 것이라고 생각합니다.
Paul Ruane

2
@ 마틴 : 내가 볼 수없는 것은 startIndex > (this.Length - length)던졌습니다 ArgumentOutOfRangeException.
user7116

2
Math.Min(str.Length, maxLength) == str.Length"스트링의 첫 번째 str.Length 문자"를 반환하기 위해 불필요한 문자열을 만드는 경우 검사를 제안하려고 했지만 Substring은이를 확인 return this하고 전체 문자열을 요청한 경우 수행합니다.
stevemegson

2
확장 메서드가 잠재적으로 null 문자열에서 작동하도록하려면 return str? .Substring (0, Math.Min (str.Length, maxLength));
ihake

62
string truncatedToNLength = new string(s.Take(n).ToArray());  

이 솔루션은 n이 s.Length보다 크면 여전히 올바른 일을한다는 점에서 작은 보너스를받습니다.


9
예, 그러나 Linq를 사용하여 문자열을 자르시겠습니까? 루프에서와 같이 여러 번 사용하면 이것이 매우 나쁘게 작동한다는 것을 명심하십시오. 습관의 문제로 이것을하지 마십시오
ErikE

31

당신은 LINQ를 사용할 수 있습니다 str.Take(n)또는 str.SubString(0, n)후자가 던질 곳, ArgumentOutOfRangeException대한 예외를 n > str.Length.

마음은 LINQ 버전이를 반환 IEnumerable<char>, 그래서 당신은 변환해야 할 것 IEnumerable<char>으로 string: new string(s.Take(n).ToArray()).


10
Linq를 사용하여 문자열을 자르지 마십시오. 말도 안돼.
ErikE

17

C #에서 문자열 조작을 수행해야 할 때마다 Visual Basic의 이전 기능 LeftRight함수가 누락 되어 사용하기가 훨씬 간단합니다 Substring.

따라서 대부분의 C # 프로젝트에서 확장 방법을 만듭니다.

public static class StringExtensions
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - Math.Min(length, str.Length));
    }
}

참고 : 때문에 부분이 를 throw 이미 이전 답변에서 일부 의견에 언급 된 입력 문자열의 길이가 요청 된 길이보다 작은 경우.
Math.MinSubstringArgumentOutOfRangeException

용법:

string longString = "Long String";

// returns "Long";
string left1 = longString.Left(4);

// returns "Long String";
string left2 = longString.Left(100);

나는 이것을 좋아하지만 문자열이 주어진 길이보다 짧으면 공백을 추가하지 않습니다. public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
Grandizer

strnull 확인
liviriniu

14

간단히:

public static String Truncate(String input,int maxLength)
{
   if(input.Length > maxLength)
      return input.Substring(0,maxLength);
   return input;
}

7
public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}

1
또한 조건을str == null || str.Length <= maxLength
kbrimington

6
Remove또는 Substring더 나은지 궁금해하는 사람 에게는 차이가 없습니다. 약간의 경계 검사 후 Remove(maxLength)호출합니다 Substring(0,maxLength). 잘리는 것은 "첫 번째 maxLength 문자를 가져 오십시오"또는 "maxLength 문자 다음에 모든 것을 버림"으로 생각하는지 여부에 따라 다릅니다. 물론, 그것은 둘 다이므로 귀하에게 달려 있습니다.
stevemegson

5

우리가 유효성 검사에 대해 이야기하고 있다면 왜 null 문자열 항목을 확인하지 않았습니까? 특별한 이유가 있습니까?

IsNullOrEmpty는 시스템 정의 방법이므로 삼항 연산자는 순환 복잡도 = 1이지만 if () {} else {}의 값은 2이므로 다음과 같이 도움이됩니다.

    public static string Truncate(string input, int truncLength)
    {
        return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
                   ? input.Substring(0, truncLength)
                   : input;
    }

순환 복잡성 2의 문제점은 무엇입니까?
Muflix

1

나는 그것을 사용하는 곳에서 루프에서 사용될 가능성이 높기 때문에 온라인으로 호스팅 된 프로젝트에서 이것을 관리 할 수 ​​있다면 충돌을 원하지 않았기 때문에 이것을 프로젝트에 추가했습니다. 길이는 내가 가진 열에 맞습니다. C # 7입니다

한 줄만 :

 public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";

0

.NET 하위 문자열 방법은 위험에 처해 있습니다. 다양한 시나리오를 처리하는 확장 방법을 개발했습니다. 좋은 점은 원래 동작을 유지하지만 추가 "true"매개 변수를 추가하면 확장 메서드를 사용하여 예외를 처리 한 다음 인덱스와 길이를 기준으로 가장 논리적 인 값을 반환합니다. 예를 들어 길이가 음수이면 뒤로 계산됩니다. https://dotnetfiddle.net/m1mSH9 에서 바이올린의 다양한 값으로 테스트 결과를 볼 수 있습니다 . 이것은 하위 문자열을 어떻게 해결하는지에 대한 명확한 아이디어를 제공합니다.

나는 항상 이러한 방법을 모든 프로젝트에 추가하고 코드 변경에 대해 걱정할 필요가 없습니다. 무언가가 변경되어 색인이 유효하지 않기 때문입니다. 아래는 코드입니다.

    public static String Substring(this String val, int startIndex, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
    }

    public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex, length);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        int newfrom, newlth, instrlength = val.Length;
        if (length < 0) //length is negative
        {
            newfrom = startIndex + length;
            newlth = -1 * length;
        }
        else //length is positive
        {
            newfrom = startIndex;
            newlth = length;
        }
        if (newfrom + newlth < 0 || newfrom > instrlength - 1)
        {
            return string.Empty;
        }
        if (newfrom < 0)
        {
            newlth = newfrom + newlth;
            newfrom = 0;
        }
        return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
    }

2010 년 5 월에 http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html 에서이 문제에 대해 블로그를 작성했습니다.


0

부분적으로 요약을 위해 (LINQ 솔루션 제외) int maxLength음수 값을 허용해야한다는 경고와 null 문자열의 경우 를 해결하는 두 개의 단일 라이너가 있습니다 .

  1. Substring방법 (에서 폴 Ruane의 대답 )
public static string Truncate(this string s, uint maxLength) =>
    s?.Substring(0, Math.Min(s.Length, (int)maxLength));
  1. Remove(에서 방법 kbrimington의 대답 )
public static string Truncate(this string s, uint maxLength) =>
    s?.Length > maxLength ? s.Remove((int)maxLength) : s;

-1
substring(int startpos, int lenght);

-4

문자열. 하위 문자열 (0, n); // 0-색인 시작 및 n-문자 수


4
허용되는 답변과 달리 이로 인해 인덱스 범위를 벗어난 오류가 발생할 수 있습니다.
Servy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.