2013-05-17 4 views
5

簡単な質問...文字列の長さ空白なし(C#)

文字列の長さを数えますが、その内部のスペースはありません。 など。 "私はボブ"のような文字列の場合、string.Lengthは8(6文字+2スペース)を返します。

私は、次の

s.Replace (" ", ""); 
s.Replace (" ", null); 
s.Replace (" ", string.empty); 
を試してみましたが、ただの文字(「私はボブだ」の場合6)

私の長さ(または数)を得るために、方法、または何かが必要

私は "IamBob"を試してみましたが、文字としてカウントしていたので問題は解決しませんでした。

助けが必要ですか?

+0

Jan Doerrenhausはコメントの中で、 's.Replace(" "、" ");を単独で宣言すると結果が破棄されることを示しています。 's = s.Replace(" "、" ");代わりに、戻り値が変数' s'に代入されます。文字列はC#で不変であることを思い出してください。 –

答えて

4

Replaceの結果を再割り当てするのを忘れたのでしょうか?これを試してみてください:

string s = "I am bob"; 
Console.WriteLine(s.Length); // 8 
s = s.Replace(" ", ""); 
Console.WriteLine(s.Length); // 6 
+1

彼はおそらく再割り当てするのを忘れていたといい点があります。同意する。それ以外の場合は、彼のために働いていたでしょう。しかし、あなたが上記のようにお互いの後に複数の 'Replace'を持つ理由はありません。すべてのスペースが '' ''に置き換えられると、それに続く呼び出しで置き換えられるスペースはなくなります。 –

+0

あなたはもちろんです。私は私の答えを編集しました。 –

+0

うわー、今私は信じられないほど馬鹿だと感じる...まさに正しい。空白なしで新しい文字列を保持するためのローカル変数を作成し、魅力のように動作させます。ありがとうございました! – kikx

16

これは、非空白文字の数を返します。

"I am Bob".Count(c => !Char.IsWhiteSpace(c));

Demo

Char.IsWhiteSpace

空白文字を次のUnicode文字です。

  • SPACE(U + 0020)、OGHAM SPACE MARK(U + 1680)、MONGOLIAN VOWEL SEPARATOR(U + 180E)、EN QUAD(U + 2000)、EM QUAD(U + 1000)の文字を含むSpaceSeparatorカテゴリのメンバー。 (U + 2002)、EM SPACE(U + 2003)、THREE-PER-EM SPACE(U + 2004)、FOUR-PER-EM SPACE(U + 2005)、SIX-PER-EM SPACE(U +2007)、FIGURE SPACE(U + 2007)、PUNCTUATION SPACE(U + 2008)、THIN SPACE(U + 2009)、HAIR SPACE(U + 200A)、NARROW NO-BREAK SPACE中計空間(U + 205F)、およびIDEOGRAPHIC SPACE(U + 3000)が含まれます。
  • LineSeparatorカテゴリのメンバー。これは、LINE SEPARATOR文字(U + 2028)のみで構成されます。
  • PARAGRAPH SEPARATOR文字(U + 2029)のみで構成されるParagraphSeparatorカテゴリのメンバーです。
  • LABEL(U + 000A)、LINE TABULATION(U + 000B)、FORM FEED(U + 000C)、CARRIAGE RETURN(U + 000D)、NEXT LINE(U + 000B) 0085)、およびNO-BREAK SPACE(U + 00A0)を含む。
+3

または、おそらく ''私はボブです.Length - "私はボブ" .Count(Char.IsWhiteSpace) 'は減算を行いますが、ラムダを作成する必要はありません。いいえ、おそらくマイクロオプティマイジングです。 –

+3

このコメントにも+1が付いている可能性があります:-) ***あなたの文字列 ''私はBobです ''にはアクセントの組み合わせが含まれている可能性があります_or_サロゲートペア(UTFで16ビットの値を必要とするUnicode文字-16)、カウントの解釈(あるいは 'Length')は注意が必要です。 –

6

いいえ。ここで

string s = "I am Bob"; 
Console.WriteLine(s.Replace(" ", "").Length); // 6 
Console.WriteLine(s.Replace(" ", null).Length); //6 
Console.WriteLine(s.Replace(" ", string.Empty).Length); //6 

DEMOです。

しかし、空白文字は何ですか?

http://en.wikipedia.org/wiki/Whitespace_character

whitespace characters

0

これは最速の方法です:

var spaceCount = 0; 
for (var i 0; i < @string.Lenght; i++) 
{ 
    if (@string[i]==" ") spaceCount++; 
} 
var res = @string.Lenght-spaceCount; 
+0

'string.Lenght'(または' string.Length')の速さはどれくらいですか?ループの前に変数に代入し、その変数を2回使用する方が良いでしょうか?そしてなぜ@ @文字列の中の '@'文字がすべてなぜですか? – AdrianHHH

+0

@AdrianHHHこれはメソッドを作成するためのテンプレートなので、最適化しないで、 '@' –

0

あなたの問題は、おそらく実際に置き換える値を返すむしろ、文字列を変更しない()メソッドを交換するために関連しています。

string withSpaces = "I am Bob"; 
string withoutSpaces = withSpaces.Replace(" ",""); 
Console.WriteLine(withSpaces); 
Console.WriteLine(withoutSpaces); 
Console.WriteLine(withSpaces.Length); 
Console.WriteLine(withoutSpaces.Length); 

//output 
//I am Bob 
//IamBob 
//8 
//6 
1

非常に単純な方法は、空白文字なしで文字をカウントする拡張メソッドを作成することです。ここでは、コードがあります:

public static class MyExtension 
{ 
    public static int CharCountWithoutSpaces(this string str) 
    { 
     string[] arr = str.Split(' '); 
     string allChars = ""; 
     foreach (string s in arr) 
     { 
      allChars += s; 
     } 
     int length = allChars.Length; 
     return length; 
    } 
} 

実行するには、単に文字列に対してメソッドを呼び出します。

string yourString = "I am Bob"; 
     int count = yourString.CharCountWithoutSpaces(); 
     Console.WriteLine(count); //=6 

あなたが言う含めたくない場合は別の方法として、あなたは文字列にあなたが望むように分割することができ、ピリオドやカンマ:

string[] arr = str.Split('.'); 

か:

string[] arr = str.Split(','); 
0

文字列オブジェクトにLengthCount関数の組み合わせを使用できます。ここに簡単な例があります。

string sText = "This is great text"; 
    int nSpaces = sText.Length - sText.Count(Char.IsWhiteSpace); 

これは、1つまたは複数(一貫した)スペースを正確に数えます。

希望します。

関連する問題