2010-12-02 8 views
47

文字列パラメータを受け入れるTrimStart()TrimEnd()の文字列拡張メソッドを探しています。C#TrimStart with string parameter

私は自分自身を構築することができましたが、私はいつも他の人がどのように行動するか見ることに興味があります。

どうすればいいですか?

+3

あなたの質問はあまり明確ではありません。文字列パラメータは、トリム関数で正確に何をする必要がありますか? (拡張メソッドの必須の 'this string'構文を参照していないと仮定して) – asawyer

+1

したがって、TrimStart/TrimEnd |と同じ機能を持つ2つの関数が必要です。または、開始/終了から入力文字を取り除きたいものが必要ですか? – Blam

+0

はい、TrimStartおよびTrimEndと同じ機能ですが、charではなく文字列を受け入れます。 –

答えて

66

TrimStart:

public static string TrimStart(this string target, string trimChars) 
{ 
    return target.TrimStart(trimChars.ToCharArray()); 
} 

TrimEnd:この機能は、例えば、ターゲットの開始/終了からtrimCharsの文字のいずれかをトリミングすること

public static string TrimEnd(this string target, string trimChars) 
{ 
    return target.TrimEnd(trimChars.ToCharArray()); 
} 

TrimStart:

public static string TrimStart(this string target, string trimString) 
{ 
    string result = target; 
    while (result.StartsWith(trimString)) 
    { 
     result = result.Substring(trimString.Length); 
    } 

    return result; 
} 

TrimEnd:

"foobar;'@".TrimEnd(";@'")意図は(正確に一致)文字列のすべての出現をトリミングすることである代わりに、場合 "foobar"

を返しますが、あなたは、次のようなものを使用する必要があります

public static string TrimEnd(this string target, string trimString) 
{ 
    string result = target; 
    while (result.EndsWith(trimString)) 
    { 
     result = result.Substring(0, result.Length - trimString.Length); 
    } 

    return result; 
} 
+13

"foobartes" .TrimEnd( "test" .ToCharArray())の結果がfoobarになります。 Imhoそれはあなたが完全に一致する場合にのみトリミングする必要があります。 edit:quickfix:トリミング前にtarget.EndsWith(trimChars)チェックを追加します。 – Contra

+0

が同意しました。これは、オペレーションが要求していたようには聞こえません。私は彼らがより大きな文字列の先頭から特定の文字列を切り取ることを前提としていました。文字列内のすべての文字をトリムするだけで、正確に一致しない場合が削除されます。 – Tim

+2

'string.ToCharArray()'ヒントをありがとう。 –

16

TrimStartとTrimEndは、文字の配列を取ります。これは、このようなchar型の配列として文字列を渡すことができることを意味します

var trimChars = " .+-"; 
var trimmed = myString.TrimStart(trimChars.ToCharArray()); 

だから私は、文字列パラメータを受け取るオーバーロードする必要が表示されません。

+1

うわー、それは恥ずかしいです。私はそれがどのように機能するのか分からなかった。ありがとう! –

+4

この解決策は、**任意の**順序のトリム文字に一致することに注意してください。たとえば、 'myString =" Sammy "および' trimChars = "Sam" 'が返された場合、" y "が返されますが、期待される結果は" my "です。だからそれはあまりにもトリムし、トリム語をそれほど考慮しません。 – Matt

-1

たとえば、文字列 "HelloWorld"が指定されていて、 "Hello"で始まる部分を「トリムする」関数を呼び出すとしたら、「World」のままにしておきます。私はこれが本当に部分文字列演算であると主張したいと思います。文字列の長さが不明なトリム演算ではなく、既知の長さの文字列の一部を取り除いているからです。

このように、SubstringAfterSubstringBeforeという2つの拡張メソッドを作成しました。それをフレームワークに入れてもいいですが、そうではありませんので、自分で実装する必要はありません。 StringComparisonパラメータを持つことを忘れないでください。オプションの場合は、Ordinalをデフォルトとして使用してください。

-1

何か理由で組み込みのトリム関数を使用しなかった場合は、「〜!」などのトリミングに入力文字列を使用するとします。 TrimStartに建てられたものと本質的に同じになるように[」」、 『〜』、 『!』]

public static String TrimStart(this string inp, string chars) 
{ 
    while(chars.Contains(inp[0])) 
    { 
     inp = inp.Substring(1); 
    } 

    return inp; 
} 

public static String TrimEnd(this string inp, string chars) 
{ 
    while (chars.Contains(inp[inp.Length-1])) 
    { 
     inp = inp.Substring(0, inp.Length-1); 
    } 

    return inp; 
} 
8

私は質問が長い文字列の先頭から特定の文字列をトリミングしようとしていたと思いました。

たとえば、 "hellohellogoodbyehello"という文字列がある場合、TrimStart( "hello")を呼び出そうとすると "goodbyehello"が返されます。

その場合は、次のようなコードを使用することができます。

string TrimStart(string source, string toTrim) 
{ 
    string s = source; 
    while (s.StartsWith(toTrim)) 
    { 
     s = s.Substring(toTrim.Length - 1); 
    } 
    return s; 
} 

あなたは、文字列トリミングの多くを行うために必要な場合、これは超効率的ではないだろうが、そのわずかのためであればいくつかのケースでは、それは単純であり、仕事を完了させます。

+0

これは 'toTrim.length'で、' -1'の権利はありませんか? –

3

dotnetperls.comから、

パフォーマンス

は残念ながら、TrimStart方法は大きく最適化されていません。 の特定の状況では、パフォーマンスを上回る可能性のある文字ベースの 反復コードを記述することができます。これは、TrimStartを使用するにはアレイを に作成する必要があるためです。

ただし、カスタムコードは必ずしも配列を必要としません。しかし、すぐに開発された アプリケーションでは、TrimStartメソッドが便利です。

+0

それはどのように実装できますか?私はそれが問題だと思う。 – Matt

0

C#には関数が組み込まれていませんが、あなたの意図したとおりに動作する独自の拡張機能を記述することができます。

IndexOf/LastIndexOfを使用すると、大文字と小文字を区別するかどうかを選択できます。

私は「繰り返しトリム」機能も実装しています。

あり、両方のトリムを扱う一つの機能TrimStr(..)で、プラス.NETとの互換性のために.TrimStart(...).TrimEnd(...).Trim(..)を実装する3つの関数がトリム:

Try it in DotNetFiddle

public static class Extension 
{ 
    public static string TrimStr(this string str, string trimStr, 
        bool trimEnd = true, bool repeatTrim = true, 
        StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) 
    { 
     int strLen; 
     do 
     { 
      if (!(str ?? "").EndsWith(trimStr)) return str; 
      strLen = str.Length; 
      { 
      if (trimEnd) 
       { 
        var pos = str.LastIndexOf(trimStr, comparisonType); 
        if ((!(pos >= 0)) || (!(str.Length - trimStr.Length == pos))) break; 
        str = str.Substring(0, pos); 
       } 
       else 
       { 
        var pos = str.IndexOf(trimStr, comparisonType); 
        if (!(pos == 0)) break; 
        str = str.Substring(trimStr.Length, str.Length - trimStr.Length); 
       } 
      } 
     } while (repeatTrim && strLen > str.Length); 
     return str; 
    } 

    // the following is C#6 syntax, if you're not using C#6 yet 
    // replace "=> ..." by { return ... } 

    public static string TrimEnd(this string str, string trimStr, 
      bool repeatTrim = true, 
      StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) 
      => TrimStr(str, trimStr, true, repeatTrim, comparisonType); 

    public static string TrimStart(this string str, string trimStr, 
      bool repeatTrim = true, 
      StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) 
      => TrimStr(str, trimStr, false, repeatTrim, comparisonType); 

    public static string Trim(this string str, string trimStr, bool repeatTrim = true, 
     StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) 
     => str.TrimStart(trimStr, repeatTrim, comparisonType) 
       .TrimEnd(trimStr, repeatTrim, comparisonType); 

} 

は今、あなただけ使用することができますそれは好きです

Console.WriteLine("Sammy".TrimEnd("my")); 
    Console.WriteLine("moinmoin gibts gips? gips gibts moin".TrimStart("moin", false)); 
    Console.WriteLine("moinmoin gibts gips? gips gibts moin".Trim("moin").Trim()); 
出力

サム
moin gibtsのGIPSを作成

? gips gibts moin
gibts gips?ギプスギブズ

+0

TrimStrは、Trim、TrimStart、およびTrimEndによって内部的に使用されることに注意してください。 – Matt

+0

違いは、TrimStrを使用して、トリムを文字列の先頭または末尾から指定する場合は、パラメータ経由で決定できることです。 – Matt