2013-05-17 19 views
5

piccola domanda rapida ...Lunghezza della stringa senza spazi (C#)

ho bisogno di contare la lunghezza di una stringa, ma senza gli spazi all'interno di esso. E.g. per una stringa come "I am Bob", string.Length restituirebbe 8 (6 lettere + 2 spazi).

Ho bisogno di un metodo, o qualcosa del genere, per darmi la lunghezza (o il numero di) solo le lettere (6, nel caso di "Io sono Bob")

Ho provato quanto segue

s.Replace (" ", ""); 
s.Replace (" ", null); 
s.Replace (" ", string.empty); 

per cercare di ottenere "IamBob", cosa che ho fatto, ma non ha risolto il mio problema perché contasse ancora "" come personaggio.

Qualsiasi aiuto?

+0

Come Jan Doerrenhaus indica in un commento, dicendo 's.Replace (" "," ");' come un'istruzione da sola porta al risultato che viene scartato. Hai bisogno di 's = s.Replace (" "," ");' invece, dove il valore di ritorno è assegnato alla tua variabile 's'. Ricorda che le stringhe sono immutabili in C#. –

risposta

4

Probabilmente hai dimenticato di riassegnare il risultato di Replace. Prova questo:

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

Un buon punto che probabilmente ha dimenticato di riassegnare. Sono d'accordo. Altrimenti avrebbe funzionato per lui. Ma non c'è motivo di avere più "Sostituzioni" una dopo l'altra come sopra. Una volta che tutti gli spazi sono stati sostituiti da "" "', non ci sono più spazi da sostituire nelle chiamate che seguono. –

+0

Hai ragione, certo. Ho modificato la mia risposta. –

+0

Wow, ora mi sento incredibilmente stupido ... Esatto, non ho assegnato il nuovo valore in modo che si perdesse. Crea una variabile locale per contenere la nuova stringa senza spazi, funziona come un incantesimo. GRAZIE! – kikx

16

Questo restituisce il numero di caratteri non spazi bianchi:

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

Demo

Char.IsWhiteSpace:

bianco caratteri di spazio sono i seguenti caratteri Unicode:

  • Membri della categoria SpaceSeparator, che include i caratteri SPACE (U + 0020), OGHAM SPACE MARK (U + 1680), MONGOLIAN VOWEL SEPARATOR (U + 180E), EN QUAD (U + 2000), EM QUAD (U + 2001), EN SPACE (U + 2002), EM SPAZIO (U + 2003), SPAZIO PER PEREMPI (U + 2004), QUATTRO PER SPAZI SPAZIATORI (U + 2005), SIX-PER-EM SPAZIO (U + 2006), SPAZIO DI FIGURA (U + 2007), SPAZIO DI PUNTEGGIO (U + 2008), SPAZIO SOTTILE (U + 2009), SPAZIO PER CAPELLI (U + 200A), SPAZIO NO-BREAK NARROW (U + 202F), SPAZIO MATEMATICO MEDIO (U + 205F), SPAZIO IDEOGRAFICO (U + 3000).
  • Membri della categoria LineSeparator, costituita esclusivamente dal carattere SEPARATOR LINE (U + 2028).
  • Membri della categoria ParagraphSeparator, costituita esclusivamente dal carattere PARAGRAPH SEPARATOR (U + 2029).
  • I caratteri TABULAZIONE CARATTERE (U + 0009), ALIMENTAZIONE LINEA (U + 000A), TABULAZIONE LINEA (U + 000B), ALIMENTAZIONE FORMA (U + 000C), RITORNO CARRELLO (U + 000D), LINEA SUCCESSIVA (U + 0085) e NO-BREAK SPACE (U + 00A0).
+3

O forse "I am Bob". Lunghezza - "I am Bob" .Count (Char.IsWhiteSpace) 'che esegue una sottrazione ma non ha bisogno di creare un lambda. No, probabilmente sto micro-ottimizzando. –

+3

Ottimo, forse questo commento otterrà anche +1 :-) *** Se la tua stringa '" I am Bob "' potrebbe contenere combinazioni di accenti _o_ coppie surrogate (caratteri Unicode che richiedono _two_ valori a 16 bit in UTF -16), quindi l'interpretazione del conteggio (o anche 'Lunghezza') dovrebbe fare attenzione. –

6

No. Non è così.

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 

Ecco un DEMO.

Ma quali sono i caratteri bianchi?

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

whitespace characters

0

questo è il modo più veloce:

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

Quanto è veloce 'string.Lenght' (o anche' string.Length')? Sarebbe meglio assegnarlo a una variabile prima del ciclo e quindi utilizzare quella variabile due volte? E perché tutti i caratteri '@' in '@ stringa'? – AdrianHHH

+0

@AdrianHHH questo è il template per creare il metodo quindi non lo ottimizzo, leggo su C# per sapere cosa è '@' –

0

Il tuo problema è probabilmente legata al metodo replace() in realtà non cambiare la stringa, piuttosto restituendo il valore sostituito;

1

Un modo piuttosto semplice è quello di scrivere un metodo di estensione che farà proprio questo: contare i caratteri senza spazi bianchi. Ecco il codice:

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; 
    } 
} 

Per eseguire, è sufficiente chiamare il metodo sulla stringa:

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

In alternativa, è possibile dividere la stringa un modo desiderato se non si desidera includere per esempio, periodi o virgole:

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

o:

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

È possibile utilizzare una combinazione delle funzioni Length e Count sull'oggetto stringa. Qui c'è un semplice esempio.

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

Questo conterrà uno o più spazi (coerenti) con precisione.

Spero che aiuti.

Problemi correlati