برای شمارش هر آیتم در یک لیست باکس روش های متفاوتی وجود دارد . به مثال زیر توجه کنید :
آیتم های ما شامل موارد زیر می شود :
1-علی
2-رضا
3-رضا
4-محسن
5-علی
6-رضا
حال اگر از قطعه کد زیر استفاده کنید :
public int CountWords(ArrayList list, string item) { int count = 0; foreach (string str in list) { if (item == str) count++; } return count; } private void button4_Click(object sender, EventArgs e) { listBox3.Items.Clear(); ArrayList arrList = new ArrayList(); int count = 0; foreach (object item in listBox2.Items) { arrList.Add(item); } foreach (string str in arrList) { count = obj.CountWords(arrList, str); listBox3.Items.Add(str + ": " + count); } }
خروجی شما به این شکل خواهد بود :
علی : 2
رضا : 3
رضا : 3
محسن : 1
علی : 2
رضا : 3
گرچه که شمارش ها به درستی انجام شده است اما تعدادی آیتم اضافی در خروجی وجود دارد که زیبایی نتیجه را خراب می کند . حال می خواهیم قطعه کد هایی بنویسیم که نتیجه را به شکل زیر شمارش کرده و نشان دهد :
علی : 2
محسن :1
رضا :3
روش اول
listBox2.DataSource = listBox1.Items.Cast<object>().GroupBy(x => x).Select(x => $"{x.Key}:{x.Count()}").ToList();
توجه :: قطعه کد بالا در صورتی که بیش از 2 بار اجرا شود با خطای items collection cannot be modified when the datasource property is set رو به رو خواهید شد . برای رفع این مشکل از کد زیر استفاده کنید که کامل شده ی کد بالاست :
// count each item new_domain_list.DataSource = null; new_domain_list.Items.Clear(); new_domain_list.DataSource = all_domain.Items.Cast<object>().GroupBy(x => x).Select(x => $"{x.Key}:{x.Count()}").ToList();
روش دوم
می توانید از کتابخانه Linq GroupBy استفاده کنید که کد آن به شکل زیر است :
private void button4_Click(object sender, EventArgs e) { listBox3.Items.Clear(); var temp = listBox2.Items.Cast<string>().GroupBy(s => s); foreach(var g in temp) listBox3.Items.Add(g.Key + ": " + g.Count()); }
حال همان کد بدون شمارش
private void button4_Click(object sender, EventArgs e) { listBox3.Items.Clear(); var temp = listBox2.Items.Cast<string>().GroupBy(s => s); foreach(var g in temp) { int count = 0; foreach(string s in g) count++; listBox3.Items.Add(g.Key + ": " + count); } }
روش سوم
می توانید از Distinct استفاده کنید :
foreach (string str in arrList.Distinct())