سلام.
علاوه بر کدی که امید قرار داد، می تونید کد زیر رو هم تست کنید (یه کم حالات بیشتری رو در نظر می گیره) :
Dictionary<string, int> mydic = new Dictionary<string, int>();
StreamReader sr = new StreamReader("d:\\test2.txt");
string AllChar = sr.ReadToEnd();
sr.Close();
char[] a = new char[]{' ', '.',',','!', '?', '\n','\r'};
string[] records = AllChar.Split(a);
for (int i = 0; i < records.Length; i++)
{
if (!string.IsNullOrWhiteSpace(records[i]))
{
if (mydic.ContainsKey(records[i]))
{
mydic[records[i]]++;
}
else
{
mydic.Add(records[i], 1);
}
}
}
foreach (var result in mydic)
{
Console.Write(string.Format("repeat {0} for word {1}\n", result.Value, result.Key));
}
Console.ReadKey();
اگر نمی خواید از دیکشنری استفاده کنید و قصد استفاده از آرایه ها رو دارید، باید اینو دقت کنید که با آرایه های معمولی گرچه میشه انجامش داد ولی ایرادی که داره اینه که آرایه ها از یک جنس هستن در صورتیکه شما باید ترکیبی از نوع داده ای رشته (کلمات) و نوع int (تکرار هر کلمه) رو داشته باشید. راهی که به نظر من میرسه اینه که آرایه دو بعدی رشته ای در نظر بگیرید و موقع افزودن به مقدار تکرار هر کلمه، ابتدا اونو به عدد تبدیل کنید و بعدش بهش یکی اضافه کنید و دوباره بصورت رشته ای ذخیره کنیدش. بذارید کدها رو بذارم و روی کدها توضیحات رو بگم تا راحت تر متوجه بشید :
StreamReader sr = new StreamReader("d:\\test2.txt");
string AllChar = sr.ReadToEnd();
sr.Close();
char[] a = new char[]{' ', '.',',','!', '?', '\n','\r'};
string[] records = AllChar.Split(a);
string[][] myresult = new string[records.Length][];
for (int k = 0; k < records.Length; k++)
{
myresult[k] = new string[2];
myresult[k][0] = string.Empty;
myresult[k][1] = "0";
}
for (int i = 0; i < records.Length; i++)
{
if (!string.IsNullOrWhiteSpace(records[i]))
{
for (int j = 0; j < myresult.Length; j++)
{
if (!string.IsNullOrWhiteSpace(myresult[j][0]))
{
if (records[i].Trim() == myresult[j][0])
{
myresult[j][1] = (Convert.ToInt32(myresult[j][1]) + 1).ToString();
break;
}
}
else
{
myresult[j][0] = records[i];
myresult[j][1] = "1";
break;
}
}
}
}
for (int i = 0; i < myresult.Length; i++)
{
if(!string.IsNullOrWhiteSpace(myresult[i][0]))
Console.WriteLine(string.Format("repeat {0} for word {1}", myresult[i][1], myresult[i][0]));
}
Console.ReadKey();
من در این روش از Jagged Array ها استفاده کردم. این نوع آرایه ها رو خانه هایی فرض کنید که درون هر خانه خودش یک آرایه دیگه وجود داره. چون ما با عبارات دو مقداری (کلمه و تکرار کلمه) سر و کار داریم، هر خانه این آرایه رو کلمه ای در نظر بگیرید که شامل دو مقدار هست. یکی خود کلمه و دیگری تعداد تکرارش.
در گام بعدی من به تعداد کلمات فایلمون اومدم خونه برای jagged array مورد نظرمون new کردم و این خونه ها رو بصورت پیش فرض متن کلمات رو برابر خالی (Empty ) و تعداد تکرار 0 قرار دادم.
حالا باید کلمات فایل مورد نظر که درون records قرار دارند رو با اعداد موجود در jagged array مقایسه کنیم. یعنی یک حلقه for داخلی خواهیم داشت که حداکثر به تعداد خانه های آرایه باید با کلمات فایلمون مقایسه بشه. در زمان مقایسه کلمات فایل با کلمات موجود در آرایه ممکنه 2 حالت پیش بیاد. یا کلمه موجود در فایل قبلا در آرایه ذخیره شده، در اینصورت به تعداد اون یکی اضافه میشه و از break برای خروج از حلقه استفاده شده. یا اینکه اون کلمه ثبت نشده و یک کلمه جدید هستش که در اینصورت کلمه درج میشه و تعداد تکرار 1 هم براش در نظر گرفته میشه و دوباره از break برای خروج از حلقه استفاده شده.
در حلقه for ای هم که برای چاپ آرایه در نظر گرفتم فقط کلماتی چاپ شدن که empty نباشن.
من این روش رو توصیه نمی کنم. چون هم درکش یه خورده مشکله و هم اینکه واقعا راه بهینه ای نیست. ولی بهرحال امیدوارم کار شما رو راه بندازه.
موفق باشید.