Stringクラスのどのメソッドが最初のN文字のみを返しますか?


184

拡張メソッドをStringクラスに記述して、入力文字列toが指定された長さよりも長い場合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は必要ですか?サブストリングは、2番目のパラメーターが長さよりも大きい場合は、長さを挿入するだけであることを知っていると思いましたか?
マーティン

12
System.String.InternalSubStringWithChecksはArgumentOutOfRangeをスローします。
ポールルアン

2
@マーティン:私が見ることができるわけではない、をstartIndex > (this.Length - length)スローしArgumentOutOfRangeExceptionます。
user7116 2010

2
Math.Min(str.Length, maxLength) == str.Length不要な文字列を作成して「strの最初のstr.Length文字」を返すかどうかを確認することをお勧めしますが、Substringはその確認をreturn this行い、文字列全体を要求した場合にのみ行います。
stevemegson 2010

2
nullの可能性がある文字列を拡張メソッドで機能させる場合は、str?.Substring(0、Math.Min(str.Length、maxLength));を返します。
2016年

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 2018年

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));
    }
}

注:
このMath.Min部分があるのSubstringは、ArgumentOutOfRangeException前の回答の下のコメントですでに述べたように、入力文字列の長さが要求された長さよりも短い場合にがスローされるためです。

使用法:

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、2018

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 2010

5

検証について話している場合は、なぜnull文字列エントリをチェックしていないのか。特定の理由はありますか?

IsNullOrEmptyはシステム定義のメソッドであり、3項演算子は循環的複雑度= 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 2018年

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 Substringメソッドには危険が伴います。さまざまなシナリオを処理する拡張メソッドを開発しました。元の動作は維持されますが、「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文字列のケースに対処する2つのワンライナーを次に示します。

  1. Substring(からの道ポール・ルアン・の答え):
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;


-4

string.Substring(0、n); // 0-開始インデックスとn-文字数


4
受け入れられた回答とは異なり、これはインデックスの範囲外エラーを引き起こす可能性があります。
2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.