ما یک جمله ی بلند را در یک Textbox در سی شارپ قرار داده ایم و می خواهیم تعداد کلمات آن را بشماریم ، کدی که در زیر مشاهده می کنید فقط درصورتی که یک خط باشد کار می کند. چگونه می توانیم این کار را بدون اتکا به regex یا عملکردهای خاص دیگر انجام دهیم ؟
string whole_text = richTextBox1.Text; string trimmed_text = whole_text.Trim(); string[] split_text = trimmed_text.Split(' '); int space_count = 0; string new_text = ""; foreach(string av in split_text) { if (av == "") { space_count++; } else { new_text = new_text + av + ","; } } new_text = new_text.TrimEnd(','); split_text = new_text.Split(','); MessageBox.Show(split_text.Length.ToString ());
روش اول
برای شمارش کلمات در سی شارپ روش های مختلفی وجود دارد . به طور ساده با یک حلقه می توان جملات را خواند و هرکجا که به فضای خالی space رسید آن را یک کلمه در نظر گرفت . اما روش های بهتری نیز وجود دارند به طور مثال String.Split که به طور خودکار تعداد (به طور بالقوه) زیادی اشیا String را محاسبه می کند . همچنین یک نکته مهمتر اینکه اگر متن شما در textbox مدام تغییر کند،باید این محاسبه را در یک کنترل کننده رویداد انجام دهید تا از تکرار ساده دستی شمارش کاراکترها راحت شوید . می توانید از الگوریتمی مشابه این استفاده کنید:
int wordCount = 0, index = 0; // skip whitespace until first word while (index < text.Length && char.IsWhiteSpace(text[index])) index++; while (index < text.Length) { // check if current char is part of a word while (index < text.Length && !char.IsWhiteSpace(text[index])) index++; wordCount++; // skip whitespace until next word while (index < text.Length && char.IsWhiteSpace(text[index])) index++; }
روش دوم
ابتدا متن را از پرونده دریافت کنید. رشته ها را از فضاهای خالی تقسیم کنید -> هر کلمه را به لیست رشته های جدید اضافه کنید -> شمارش اولیه را 0 قرار دهید و هر بار آرایه 1 را برای شمارش یک مقدار اضافه کنید [i] خالی نیست.
static void Main(string[] args) { var path = @"C:\Users\Saurav Shrestha\Desktop\C_sharp\FileInfoPractice.txt"; var content = File.ReadAllText(path); Console.WriteLine(content); var words = content.Split(' '); var array = new List<string>(); foreach (var word in words) array.Add(word); int count = 0; for (int i = 0; i < array.Count; i++) { if (array[i] != null) count += 1; } Console.WriteLine("Number of Words in the File: {0}", count); } }
روش سوم
می توانید از قطعه کد زیر برای گرفتن تعداد کلمات در یک رشته استفاده کنید. فقط توجه داشته باشید فاصله های دوتایی باعث بهم ریختن تعداد می شوند.
public static int CountWords(this string line) { var wordCount = 0; for (var i = 0; i < line.Length; i++) if (line[i] == ' ' || i == line.Length - 1) wordCount++; return wordCount; }
روش چهارم
static void Main(string[] args) { string str; int i, wrd, l; StringBuilder sb = new StringBuilder(); Console.Write("\n\nCount the total number of words in a string :\n"); Console.Write("--------------------------------------------------- ---\n"); Console.Write("Input the string : "); str = Console.ReadLine(); l = 0; wrd = 1; foreach (var a in str) { sb.Append(a); if (str[l] == ' ' || str[l] == '\n' || str[l] == '\t') { wrd++; } l++; } Console.WriteLine(sb.Replace(' ', '\n')); Console.Write("Total number of words in the string is : {0}\n", wrd); Console.ReadLine(); }
روش پنجم
public static int WordCount(string str) { int num=0; bool wasInaWord=true;; if (string.IsNullOrEmpty(str)) { return num; } for (int i=0;i< str.Length;i++) { if (i!=0) { if (str[i]==' ' && str[i-1]!=' ') { num++; wasInaWord=false; } } if (str[i]!=' ') { wasInaWord=true; } } if (wasInaWord) { num++; } return num; }
روش ششم
public static int CountWords(string test) { int count = 0; bool inWord = false; foreach (char t in test) { if (char.IsWhiteSpace(t)) { inWord = false; } else { if (!inWord) count++; inWord = true; } } return count; }
روش هفتم
char[] delimiters = new char[] {' ', '\r', '\n' }; whole_text.Split(delimiters,StringSplitOptions.RemoveEmptyEntries).Length;
روش هشتم
روش های بهتری برای انجام این کار وجود دارد ، اما اگر همچنان جواب نگرفته اید موارد زیر را امتحان کنید:
string whole_text = richTextBox1.Text; string trimmed_text = whole_text.Trim(); // new line split here string[] lines = trimmed_text.Split(Environment.NewLine.ToCharArray()); // don't need this here now... //string[] split_text = trimmed_text.Split(' '); int space_count = 0; string new_text = "";
حالا دو حلقه foreach درست کنید. یکی برای هر سطر و دیگری برای شمارش کلمات درون سطرها.
foreach (string line in lines) { // Modify the inner foreach to do the split on ' ' here // instead of split_text foreach (string av in line.Split(' ')) { if (av == "") { space_count++; } else { new_text = new_text + av + ","; } } } new_text = new_text.TrimEnd(','); // use lines here instead of split_text lines = new_text.Split(','); MessageBox.Show(lines.Length.ToString()); }