شمارش هر آیتم جداگانه لیست باکس در سی شارپ #C

برای شمارش هر آیتم در یک لیست باکس روش های متفاوتی وجود دارد . به مثال زیر توجه کنید :

آیتم های ما شامل موارد زیر می شود : 

۱-علی

۲-رضا

۳-رضا

۴-محسن

۵-علی

۶-رضا

حال اگر از قطعه کد زیر استفاده کنید :

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);
    }

}  

خروجی شما به این شکل خواهد بود :

علی : ۲

رضا : ۳

رضا : ۳

محسن : ۱

علی : ۲

رضا : ۳

گرچه که شمارش ها به درستی انجام شده است اما تعدادی آیتم اضافی در خروجی وجود دارد که زیبایی نتیجه را خراب می کند . حال می خواهیم قطعه کد هایی بنویسیم که نتیجه را به شکل زیر شمارش کرده و نشان دهد :

علی : ۲

محسن :۱

رضا :۳

روش اول

پلتفرم بوی اجرا شدن خروجی صحیح قطعه کد زیر را تایید می کند
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
listBox2.DataSource = listBox1.Items.Cast<object>().GroupBy(x => x).Select(x => $"{x.Key}:{x.Count()}").ToList();

توجه :: قطعه کد بالا در صورتی که بیش از ۲ بار اجرا شود با خطای 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())

 

آیا این نوشته برای شما مفید بود ؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *