2013-07-23 12 views
8

Chcę policzyć słowa i spacje w moim ciągu. Ciąg wygląda następująco:Policz słowa i spacje w ciągu C#

Command do something ptuf(123) and bo(1).ctq[5] v:0, 

mam coś takiego do tej pory

int count = 0; 
string mystring = "Command do something ptuf(123) and bo(1).ctq[5] v:0,"; 
foreach(char c in mystring) 
{ 
if(char.IsLetter(c)) 
    { 
    count++; 
    } 
} 

Co należy zrobić, aby policzyć obowiązuje również?

+4

mówiłeś liczyć słowa, ale liczą liter. Czy tego właśnie chciałeś? – Jonesopolis

+1

To nie są słowa, znaki. – Praveen

+1

Masz rację, popełniłem błąd w moim kodzie. Chcę policzyć słowa. Przepraszam. – user2592968

Odpowiedz

27
int countSpaces = mystring.Count(Char.IsWhiteSpace); // 6 
int countWords = mystring.Split().Length; // 7 

Należy pamiętać, że oba mają wartość Char.IsWhiteSpace, która przyjmuje inne znaki niż " " jako białe znaki (np. newline). Zajrzyj do działu uwag, aby zobaczyć, który dokładnie.

+0

Lol .... gdybym po prostu zrozumiał Linq w czasie, gdy pisałem te metody moje .... Nawiasem mówiąc, czy eliminuje słowa, gdy są dwa puste przestrzenie? –

+0

@Daniel: Nie, to by zawierało słowa "duch", gdyby istniały dwie równoległe przestrzenie. –

+0

Widzę .... jeszcze lepiej niż moja odpowiedź, po prostu usuń elementy "duchów". –

0

jeśli chcesz liczyć spacji można użyć LINQ:

int count = mystring.Count(s => s == ' '); 
+1

Technicznie musisz dodać +1. '" a b c ".Count (x => x == '')' = 2, gdy są 3 słowa. –

+0

Co robić? To było wyłącznie do liczenia miejsc. – Jonesopolis

0

mam jakiś gotowy kod, aby otrzymać listę wyrazów w ciągu znaków: (metody rozszerzenie, musi być w klasie statycznej)

/// <summary> 
    /// Gets a list of words in the text. A word is any string sequence between two separators. 
    /// No word is added if separators are consecutive (would mean zero length words). 
    /// </summary> 
    public static List<string> GetWords(this string Text, char WordSeparator) 
    { 
     List<int> SeparatorIndices = Text.IndicesOf(WordSeparator.ToString(), true); 

     int LastIndexNext = 0; 


     List<string> Result = new List<string>(); 
     foreach (int index in SeparatorIndices) 
     { 
      int WordLen = index - LastIndexNext; 
      if (WordLen > 0) 
      { 
       Result.Add(Text.Substring(LastIndexNext, WordLen)); 
      } 
      LastIndexNext = index + 1; 
     } 

     return Result; 
    } 

    /// <summary> 
    /// returns all indices of the occurrences of a passed string in this string. 
    /// </summary> 
    public static List<int> IndicesOf(this string Text, string ToFind, bool IgnoreCase) 
    { 
     int Index = -1; 
     List<int> Result = new List<int>(); 

     string T, F; 

     if (IgnoreCase) 
     { 
      T = Text.ToUpperInvariant(); 
      F = ToFind.ToUpperInvariant(); 
     } 
     else 
     { 
      T = Text; 
      F = ToFind; 
     } 


     do 
     { 
      Index = T.IndexOf(F, Index + 1); 
      Result.Add(Index); 
     } 
     while (Index != -1); 

     Result.RemoveAt(Result.Count - 1); 

     return Result; 
    } 


    /// <summary> 
    /// Implemented - returns all the strings in uppercase invariant. 
    /// </summary> 
    public static string[] ToUpperAll(this string[] Strings) 
    { 
     string[] Result = new string[Strings.Length]; 
     Strings.ForEachIndex(i => Result[i] = Strings[i].ToUpperInvariant()); 
     return Result; 
    } 
0

Oprócz wpisu Tima, w przypadku gdy masz wyściółka na bokach lub wielokrotne spacje obok siebie:

Int32 words = somestring.Split(   // your string 
    new[]{ ' ' },       // break apart by spaces 
    StringSplitOptions.RemoveEmptyEntries // remove empties (double spaces) 
).Length;         // number of "words" remaining 
0

Oto metoda za pomocą wyrażeń regularnych. Po prostu coś innego do rozważenia. Lepiej jest, jeśli masz długie łańcuchy z wieloma różnymi typami białych znaków. Podobne do WordCounta Microsoft Word.

var str = "Command do something ptuf(123) and bo(1).ctq[5] v:0,"; 
int count = Regex.Matches(str, @"[\S]+").Count; // count is 7 

Dla porównania

var str = "Command  do something  ptuf(123) and bo(1).ctq[5] v:0,"; 

str.Count(char.IsWhiteSpace) wynosi 17, natomiast liczba regex jest nadal 7.

+0

_Niektórzy ludzie, gdy napotykają problem, myślą: "Wiem, użyję wyrażeń regularnych". Teraz mają dwa problemy. –

+0

@BradChristie Czuję, że niewłaściwie używasz tego cytatu. Nie piszę tutaj jakiegoś parsera. Po prostu pasuje do tekstu, który nie jest odstępem od tekstu, a następnie pojawia się liczba. Nie policza kolejnych spacji i po zakończeniu nie musisz czyścić kolekcji. Samo wyrażenie jest tak podstawowe, jak tylko możesz. Nie jest trudno zrozumieć lub utrzymać. Nie podoba mi się poczucie, że robię coś niewłaściwie, więc czy mógłbyś wyjaśnić, dlaczego uważasz, że ten cytat dotyczy tego rozwiązania? – Gray

+0

Regex jest przydatny w pewnych sytuacjach, o ile jest prosty (ten jest) i łatwy w utrzymaniu (wydaje się być) powinien być w porządku. To wtedy, gdy zaczynasz go przesadzać i robisz 15-to-liniowe wyrażenie regularne, aby odfiltrować adresy e-mail, pojawi się problem. – user2366842

1

To uwzględniać:

  • Struny rozpoczynając lub kończąc przestrzeń.
  • Podwójne/potrójne/... spacje.

Zakładając, że jedynymi separatorami słowa są spacje i Twój ciąg nie jest pusty.

private static int CountWords(string S) 
{ 
    if (S.Length == 0) 
     return 0; 

    S = S.Trim(); 
    while (S.Contains(" ")) 
     S = S.Replace(" "," "); 
    return S.Split(' ').Length; 
} 

Uwaga: Pętla while może być również wykonane z regex: How do I replace multiple spaces with a single space in C#?

+1

Wiesz, że '.Split' ma przeciążenie, które akceptuje' StringSplitOptions', które może określać 'RemoveEmptyEntries'; '.Trim()' i '.Replace' są zbędne. –

+0

Dobrze, dziękuję za przypomnienie. – TTT

0
using namespace; 
namespace Application; 
class classname 
{ 
    static void Main(string[] args) 
    { 
     int count; 
     string name = "I am the student"; 
     count = name.Split(' ').Length; 
     Console.WriteLine("The count is " +count); 
     Console.ReadLine(); 
    } 
} 
+0

Nie wysyłaj odpowiedzi tylko do kodu, ale wyjaśnij, co robi Twój kod. – David

Powiązane problemy