文字列などのC#の組み込み型を拡張する方法


89

皆さん、こんにちは...私はする必要がTrimありますStringます。しかし、文字列の最後や最初だけでなく、文字列自体の中で繰り返される空白をすべて削除したいと思います。私は次のような方法でそれを行うことができます:

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

ここから得たもの。しかし、私はこのコードの一部がString.Trim()それ自体のので、Trimメソッドを拡張、オーバーロード、またはオーバーライドする必要があると思います...それを行う方法はありますか?

前もって感謝します。

回答:


163

延長できないのでstring.Trim()ここで説明するように、空白を削除して削減する拡張メソッドを作成できます。

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

そのまま使えます

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

あなたにあげる

text = "I'm wearing the cheese. It isn't wearing me!";

ファイルには特別な名前が必要ですか?またはどこに保存しますか?Utilクラスなどに入れることはできますか?
2014

1
@testingプロジェクトで参照されている限り、どこにでも置くことができます。それらを特定の名前空間に配置する場合は、他のクラスと同様に、「using」ステートメントを使用してそれらを取り込みます。
2014年

なぜTrimAndReduce関数から正規表現を返さなかったのですか?それはあなたの答えをはるかに読みやすくしたでしょう。他の場所でそれを呼び出す必要があるほど多くの回答を使用しない限り、LOL
quemeful

23

出来ますか?はい、ただし拡張メソッドのみ

クラスSystem.Stringはシールされているため、オーバーライドまたは継承を使用できません。

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
明確にするために、いいえ、実行するアクションを変更することはできませんString.Trim
Michael Petrotta、2011

10

あなたの質問には「はい」と「いいえ」があります。

はい、拡張メソッドを使用して既存のタイプを拡張できます。当然、拡張メソッドは、型のパブリックインターフェイスにのみアクセスできます。

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

いいえ、このメソッドを呼び出すことはできません Trim()。拡張メソッドはオーバーロードに参加しません。コンパイラは、これを詳述するエラーメッセージを表示する必要があると思います。

拡張メソッドは、メソッドを定義する型を含む名前空間が使用されている場合にのみ表示されます。



2

拡張メソッドの使用に加えて-おそらくここでは良い候補です-オブジェクトを「ラップ」することも可能です(たとえば「オブジェクト構成」)。ラップされたフォームにラップされているものよりも多くの情報が含まれていない限り、ラップされたアイテムは、情報を失うことなく暗黙的または明示的な変換を介してクリーンに渡されます:タイプ/インターフェイスの変更のみ。

ハッピーコーディング。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.