5

末尾部分を削除するには、コードを使用します

str.substring(0,str.length -2) 

より良い方法はありますか?特に str.length の使用は嫌いです。

編集 質問をできるだけ短くシンプルにしたかったので、 String メソッドを見落としただけだと思いました。私はより正確にしようとします。

文字列の末尾から指定された数の文字を削除する必要があります。私はキャラクターが何であるかを気にしたくありませんし、さらにキャラクターを削除するリスクを導入したくありません.

数値が文字列の長さよりも大きい場合は、例外があります (文字列は以前に検証する必要があります)。

特に長さの問題はありませんが、変数を 2 回参照する場合 (変数ではなく関数を想像してください)。減算の必要性も好きではありませんが、それは個人的な好みに過ぎません。

VB.NET ソリューション

質問には vb.net というタグが付けられているため、vb.net コードがあります (モジュール内にある必要があります)。

<System.Runtime.CompilerServices.Extension> _
Public Shared Function RemoveFromEnd(stringValue As String, removedCharacters As Integer) As String
    Return stringValue.Substring(0, stringValue.Length - removedCharacters)
End Function
4

5 に答える 5

8

あなたの懸念が単に見ているものの美学である場合、この機能を拡張メソッドでラップするのは簡単です:

    public static string RemoveFromEnd(this string stringValue, int removedCharacters)
    {
       return stringValue.Substring(0, stringValue.Length - removedCharacters);
    }

したがって、単に使用できます

    str.RemoveFromEnd(2);

そしてそれで終わります。

アンマネージ言語で遅いという評判が原因で string.length を使用することのパフォーマンスについて心配している場合でも、心配する必要はありません。.Net の文字列は不変であるため、文字列が宣言されたときに String.Length が設定され、変更されることはありません。したがって、String.Length の参照は一定時間 (Big-O(1) など) で完了し、非常に高速です。対照的に、パフォーマンスに敏感な場合は、代わりに Substring 呼び出しに集中する必要があります。.Net では、Substring は線形時間 (Big-O(n) など) で完了します。ここで、n は元の文字列の長さです。したがって、コード行のパフォーマンスのボトルネックになります。弦の長さに対して遅くなります。

ただし、非常に長い文字列を扱っている場合は、それをそのまま飲み込んではいけない場合があります。このようなことを回避するには、代わりに拡張メソッドで StringBuilder を使用します。

    public static string RemoveFromEnd(this string stringValue, int removedCharacters)
    {
        var newString = new StringBuilder(stringValue);
        newString.Length = newString.Length - removedCharacters;
        return newString.ToString();
    }

これはすべて一定時間である必要がありますが、Reflector を再確認して、StringBuilder.Length が想定どおりに動作することを確認する必要があります。線形時間であっても、removedCharacters に関しては線形であり、必然的に元の文字列の長さより短くなります。トレードオフは、明らかに、StringBuilder が範囲外になるまでメモリ使用量がわずかに増えることですが、非常に高速に完了する拡張メソッドでラップする場合は問題になりません。

編集: はい、 StringBuilder.Length は、追跡している文字列の String.Length を返すだけなので、一定の時間で戻り、切り捨てへの StringBuilder のアプローチは合理的にできるだけ速くする必要があります。

于 2012-06-12T15:33:08.687 に答える
5

この関連する質問をチェックしてください:

.NET で文字列の末尾から文字列をトリムする - なぜこれがないのですか?

これを行う組み込みメソッドがないため、独自のメソッド (できれば拡張メソッド) を作成する必要があります。

public static string RemoveCharsFromEnd(this string input, int charactersToRemove) 
{
    if (input.Length > charactersToRemove) 
        return input.substring(0, input.Length - charactersToRemove);
    else
        return "";
}
于 2012-06-12T15:13:25.430 に答える
3

2したがって、を使用せずに文字列の最初の文字を削除する方法が存在しますstr.Length。つまり

str.Substring(2)

したがって、反対側からそれを行う方法を尋ねますか?フレームワークがそれを提供しているとは思わない。あなたは使用することができます

str.Remove(str.Length - 2)

しかし、それはを使用しますLength

これは、Linq を使用してパフォーマンスが悪い醜い方法です。

new string(str.Reverse().Skip(2).Reverse().ToArray())

文字列が短すぎる場合、醜いアイデアは例外をスローしません。

于 2012-06-12T15:26:23.137 に答える
0

「末尾部分」の意味によって異なります。コンテンツの後の空白のことですか?たとえば、次のようになります。

string test = "This is a test string.   "; // But you want "This is a test string."

後にスペースを削除したいですか?これは.Trim()または.TrimEnd()コマンドで可能です。これを意味しない場合は、何が問題なのかを明記してください。

于 2012-06-12T15:02:12.767 に答える
0
        var test = " test";
        // Trim all trailing spaces
        test = test.Trim();
        // Trim only starting trailing spaces
        test = test.TrimStart();
        // Trim only ending trailing spaces
        test = test.TrimEnd();


        var test = "abcTest";
        // Trim all trailing abc
        var toRemove = new char[3];
        toRemove[0] = 'a';
        toRemove[1] = 'b';
        toRemove[2] = 'c';
        test = test.TrimStart(toRemove);

Trim() 関数を使用して末尾部分を削除する必要があります

于 2012-06-12T15:03:22.593 に答える