5

文字列を大きな問題にしたり、複数の行に広げたりせずに文字列を操作しようとしているので、チェーンを使用してこれを実現しています。私が持っている質問は、このコンテキストでstring.Substring()文字列から最後の文字を削除するにはどうすればよいですか?

PHP では、これを実現するために負の数 (つまりsubstr(-1)) を引数として渡すことができますが、明らかにこれは C# の動作ではありません。

mystring = mystring.Replace('_', ' ').Substring(???);

また、上記で使用されたテクニックの実際の名前は何ですか? 私はいつもそれをコールバック チェーンと呼んでいましたが、今思うコールバック チェーンはまったく別のものです。

避けたいことに注意してください:

mystring = mystring.Replace('_', ' ');
mystring = mystring.Substring(0, mystring.Length - 1);

あなたの時間と親切な配慮を前もって感謝します.

イアン

回答ありがとうございます。文字列操作やその他の「競合する」言語について、人々がそのような強い意見を持つことができるのはおかしいです:)

4

8 に答える 8

13

Extension メソッドを作成できますRightStrip()。負の開始位置に対して SubString をオーバーロードすることはできません。

static string RightStrip(this string s, int n)
{
    return s.Substring(0, s.Length - n);
}


string s = "Hello World!";
s = s.Replace('e', 'a').RightStrip(1);
于 2009-11-18T08:03:03.357 に答える
4

次のような拡張クラスを作成します。

public static class MyStringExtensions
{
    public static string RemoveCharactersFromEnd(this string s, int n)  
    {  
        string result = string.Empty;  

        if (string.IsNullOrEmpty(s) == false && n > 0)
        {
            result = s.Remove(s.Length - n, n);
        }

        return result;
    }
}  

あれを呼べ:

Console.WriteLine("test!!".RemoveCharactersFromEnd(2));

于 2009-11-18T08:10:21.173 に答える
1

サンプルでは、​​元の文字列の長さを変更しないメソッドにチェーンしています。したがって、(originalLength-1)でSubStringを使用することを提案する回答ですが、これはもちろん一般的なケースでは機能しません。

あなたが気付いたように見える答えは、チェーンの以前のメソッドが長さを変更した一般的なケースではそれを行うことができないということです。

しかし、3.5 で独自の拡張メソッドを記述して、必要なことを行うことができます。次のようなもの、またはその変形:

public static string PhpSubstring(this string value, int length)
{
    if (length < 0) length = value.Length - length;
    return String.Substring(value, length);
}
于 2009-11-18T08:05:02.687 に答える
1

メソッド チェイニングという用語、または流暢なインターフェイスと呼ばれるものについて他の誰もが言及していることに加えて、追加したいメモが 1 つか 2 つありました。

私が提案したかったのは、拡張メソッドの優れた点は、Replace や ToLower などのシステム メソッドを含む、これと同じように感じる独自の型の変換関数を簡単に定義できることです。入力して、ある種の変換された文字列を返します。

あなたが求めている特定の変換 (一番右の文字を切り取る) は、Substring を直接使用する必要がある場合、ぎこちなく見えるかもしれませんが、次のような方法でこれをきれいに隠すことができます:

public string CutOff(this string s, int c)
{
    return s.Substring(0, s.Length - c);
}

...

return myVal.CutOff(1);

(または、少なくとも、これはうまくいくはずです!)

頑張ってください!

于 2009-11-18T08:11:56.120 に答える
0

メソッドチェーンは、あなたが探している用語です。そのような負の文字を渡すことはできませんが、メソッドをチェーンすることはできます。

mystring = mystring.Replace('_', ' ').Substring(0, mystring.Length - 1);

この場合、文字列は置換されるため、文字列の長さには影響しません

于 2009-11-18T07:59:59.590 に答える
0

mystring = mystring.Replace('_', ' ').Remove(mystring.length -1)

ただし、前の呼び出しでの文字列の長さの操作と変更が予期しない動作を引き起こすまで、 mystring の割り当ては行われないため、これは悪い考えだと思います。

于 2009-11-18T08:01:25.143 に答える
0

コナミマンのコメントをさらに進めるには:

PHP が奇妙で (率直に言って汚い危険な) オーバーロードや SubString の負の開始やカウントなどのパラメーターを許可しているからといって、それが正しい、正しい、または適切な方法であるとは限りません。

Substring(0, mystring.Length - 1) は、さまざまな言語で文字列の最後の文字を削除する事実上の方法です。

于 2009-11-18T08:02:52.347 に答える
0

いつでも正規表現を使用できます:

mystring = new Regex("^(.*).$").Match(mystring.Replace('_', ' ')).Groups[1].Value;

'_'また、最後の文字を削除するだけなので、 に置き換えられたが であるかどうかは問題ではありません' '。これはうまくいきます:

mystring = mystring.Substring(0, mystring.Length - 1).Replace('_', ' ');
于 2009-11-18T08:20:28.360 に答える