Compter les mots et les espaces dans la chaîne C #
Je veux compter les mots et les espaces dans ma chaîne. La chaîne ressemble à ceci:
Command do something ptuf(123) and bo(1).ctq[5] v:0,
J'ai quelque chose comme ça jusqu'à présent
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++;
}
}
Que dois-je faire pour compter les espaces aussi?
int countSpaces = mystring.Count(Char.IsWhiteSpace); // 6
int countWords = mystring.Split().Length; // 7
Notez que les deux utilisent Char.IsWhiteSpace
qui suppose que les caractères autres que " "
sont des espaces (comme newline
). Jetez un coup d'œil à la section des remarques pour savoir lequel exactement.
vous pouvez utiliser string.Split avec un espace http://msdn.Microsoft.com/en-us/library/system.string.split.aspx
Lorsque vous obtenez un tableau de chaînes, le nombre d'éléments est le nombre de mots et le nombre d'espaces le nombre de mots -1
Cela prendra en compte:
- Chaînes commençant ou se terminant par un espace.
- Double/triple/... espaces.
En supposant que les seuls séparateurs Word soient des espaces et que votre chaîne n'est pas nulle.
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;
}
Remarque: la boucle while peut également être réalisée avec une expression rationnelle: Comment remplacer plusieurs espaces par un seul espace en C #?
si vous voulez compter les espaces, vous pouvez utiliser LINQ:
int count = mystring.Count(s => s == ' ');
En plus de l'entrée de Tim, si vous avez un rembourrage de chaque côté ou plusieurs espaces l'un à côté de l'autre:
Int32 words = somestring.Split( // your string
new[]{ ' ' }, // break apart by spaces
StringSplitOptions.RemoveEmptyEntries // remove empties (double spaces)
).Length; // number of "words" remaining
Voici une méthode utilisant regex. Juste quelque chose d'autre à considérer. C'est mieux si vous avez de longues chaînes avec beaucoup de types d'espaces différents. Semblable à WordCount de 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
En comparaison,
var str = "Command do something ptuf(123) and bo(1).ctq[5] v:0,";
str.Count(char.IsWhiteSpace)
est 17, alors que le nombre de regex est toujours 7.
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();
}
}
J'ai du code prêt pour obtenir une liste de mots dans une chaîne: (Les méthodes d'extension, doivent être dans une classe statique)
/// <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;
}