Çözüldü C# ListBox'dan Belirlenen Sayı Kadar Rastgele Eşya Silme

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

TheErdem

Hectopat
Katılım
6 Kasım 2020
Mesajlar
346
Çözümler
3
Daha fazla  
Cinsiyet
Erkek
Merhaba, geliştirdiğim bir yazılım var. Bu yazılımın bir kısmında rastgele bir sayı üretiyorum.

Bir tane de listbox var. Bu listboxta 100 tane item olduğunu varsayalım.

Bir butona bastığımda başlangıçta rastgele ürettiğim sayı kadar rastgele itemi listboxtan silmesini istiyorum.

Mesela başlangıçta ürettiğim bu rastgele sayı 30 çıktı. O zaman listboxtan 30 tane rastgele item silecek ve geriye 70 tane kalacak.

Nasıl yapabilirim? Şimdiden teşekkürler.
 
Çözüm
@count haklısınız. Onun için her seferinde random aralığını düşmesi gerekir. Kodu geliştireceğim.

@count sorunu halletim.

Listbox üzerinde istem sayısı aralığı kadar dönecek. Bu sayede sorun ortadan kalkıyor.

C#:
Random rnd = new Random();
int random_number = rnd.Next(0, listBox1.Items.Count);
Random rnd_2 = new Random();
for (int i = 0; i <= random_number; i++){
    int random_number_2 = rnd_2.Next(0, listBox1.Items.Count);
    if (listBox1.Items.Count != 0){
        listBox1.Items.RemoveAt(random_number_2);
    }else{
        MessageBox.Show("Liste üzerine eleman kalmadı.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        break;
    }
}
Biraz bekleyin. Size ilgili kodu yazıp atacağım.

Öncelike şunu belirteyim. 60 geldi diyelim. 60 tane rastgele eleman silerken hata verebilir. Çünkü silmeye çalıştığı eleman numarası liste üzerinde yoksa sorun çıkar. O yüzden Listbox üzerindeki item sayısı üretilen sayıdan büyük olduğu sürece çalışması lazım.

@TheErdem bu kod işinizi görecektir.

C#:
Random rnd = new Random();
int random_number = rnd.Next(0, 100);

Random rnd_2 = new Random();
for (int i = 0; i<= random_number; i++){
    int random_number_2 = rnd_2.Next(0, 100);
    if (listBox1.Items.Count > random_number_2){
        listBox1.Items.RemoveAt(random_number_2);
    }
}
 
Son düzenleme:
Biraz bekleyin. Size ilgili kodu yazıp atacağım.

Öncelike şunu belirteyim. 60 geldi diyelim. 60 tane rastgele eleman silerken hata verebilir. Çünkü silmeye çalıştığı eleman numarası liste üzerinde yoksa sorun çıkar. O yüzden Listbox üzerindeki item sayısı üretilen sayıdan büyük olduğu sürece çalışması lazım.

@TheErdem bu kod işinizi görecektir.

C#:
Random rnd = new Random();
int random_number = rnd.Next(0, 100);

Random rnd_2 = new Random();
for (int i = 0; i<= random_number; i++){
    int random_number_2 = rnd_2.Next(0, 100);
    if (listBox1.Items.Count > random_number_2){
        listBox1.Items.RemoveAt(random_number_2);
    }
}
Listbox gibi C# görsel elementleri hakkında çok bilgi sahibi değilim ama, kodda şöyle bir sıkıntı olabilir mi? Şöyle bir örnekle anlatmaya çalışayım.

Listedeki total element sayısı 100 olsun
random_number da 99 geldi diyelim (0-99 elementlerinin sonuncusu yani)
listboxtan 99. elementi güzelce sildi

forun ikinci döngüsünde
random_number gene 99 geldi diyelim
listbox element sayısı 100 idi, 99 kaldı
99 > 99 olmadığı için
silme işlemi gerçekleşmedi

forun üçüncü döngüsünde
random_number gene 99 geldi diyelim
listbox element sayısı 100 idi, 99 kaldı
99 > 99 olmadığı için
silme işlemi gerçekleşmedi
....

böyle bir senaryoda 99 tane element silmesini istediğimiz bu kod sadece 1 element silmez mi? Ben yanlış anladıysam da izah edebilir misiniz?
 
@count haklısınız. Onun için her seferinde random aralığını düşmesi gerekir. Kodu geliştireceğim.

@count sorunu halletim.

Listbox üzerinde istem sayısı aralığı kadar dönecek. Bu sayede sorun ortadan kalkıyor.

C#:
Random rnd = new Random();
int random_number = rnd.Next(0, listBox1.Items.Count);
Random rnd_2 = new Random();
for (int i = 0; i <= random_number; i++){
    int random_number_2 = rnd_2.Next(0, listBox1.Items.Count);
    if (listBox1.Items.Count != 0){
        listBox1.Items.RemoveAt(random_number_2);
    }else{
        MessageBox.Show("Liste üzerine eleman kalmadı.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        break;
    }
}
 
Son düzenleme:
Çözüm
Çok teşekkür ederim, yarın kodları deneyeceğim.


Bu arada rastgele sayı tabikide listedeki item sayısından fazla gelmiyor. Limitini ona ayarladım.
 
Rica ederim, ne demek. 2. attığım kodu uygularsanız daha iyi olur.

Denedikten sonra geri dönüş yaparsanız seviniriz.
 
@count haklısınız. Onun için her seferinde random aralığını düşmesi gerekir. Kodu geliştireceğim.

@count sorunu halletim.

Listbox üzerinde istem sayısı aralığı kadar dönecek. Bu sayede sorun ortadan kalkıyor.

C#:
Random rnd = new Random();
int random_number = rnd.Next(0, listBox1.Items.Count);
Random rnd_2 = new Random();
for (int i = 0; i <= random_number; i++){
    int random_number_2 = rnd_2.Next(0, listBox1.Items.Count);
    if (listBox1.Items.Count != 0){
        listBox1.Items.RemoveAt(random_number_2);
    }else{
        MessageBox.Show("Liste üzerine eleman kalmadı.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        break;
    }
}
Merhaba, sanırım ben tam olarak istediğim şeyi anlatamamışım ama buradaki kodların üstünde biraz oynayarak istediğim şeyi yaptım.

İstediğim şey başta rastgele ürettiğim sayı kadar itemi listeboxtan silmesiydi, sizin yaptığınızı pek anlayamadım açıkçası.😅 Ama anladığım kadarıyla ona yakın bir şeyler yapmışsınız.

Değiştirdiğim kodları uzun uzun açıklayarak sitedeki Kod kısmından yazmıştım. Yaklaşık 15 dakika boyunca yazdım ve Devam Et dediğimde yazdığım şeyi buraya aktarmadı. Neden olduğunu bilmiyorum fakat çok sinirim bozuldu o yüzden tekrar yazmaya uğraşamayacağım kusura bakmayın. 🙂 İsterseniz sonra yazabilirim.

@300319 Dayanamadım tekrar yazdım. 😅

C#:
//uygulamanın amacını şöyle düşünün, bu listboxtaki elemanları rastgele şekilde A ve B grubu olarak ayırıyor.
            //Öncelikle burada A grubu için rastgele bir sayı üretiyor.
            Random rnd = new Random();
            int RastgeleSayi1 = rnd.Next(0, checkedListBox1.CheckedItems.Count);
            //Sonrasında da B grubu için. Ama bu rastgele değil. Toplam üye sayısından A grubundakileri çıkarıyor ki ayırma artansız gerçekleşsin.
            int RastgeleSayi2 = (checkedListBox1.Items.Count - RastgeleSayi1);
            //sonra formdaki progressbar'a değer ekliyor ve bu değer 1000'e ulaşınca diğer işlemleri gerçekleştiriyor.
            siticoneProgressBar1.Value += 100;
            if (siticoneProgressBar1.Value == 1000)
            {
                //Sürekli kodları baştan tekrarlamasın diye timer'i kapatıyorum
                timer2.Enabled = false;
                //sonrasında işlem bir daha tekrarlanabileceği için progressbar'ı sıfırlıyorum
                siticoneProgressBar1.Value = 0;
                //başta gruplara ayırdığımız item sayılarını labellara yazıyor.
                //label6 A grubunun üye sayısını,
                label6.Text = RastgeleSayi1.ToString();
                //label7 ise B grubunun üye sayısını temsil ediyor.
                label8.Text = RastgeleSayi2.ToString();
                //bunun sonunda formumda labelları koyduğum yerde şu şekilde bir yazı oluyor: (A grubu üye sayısı: 70, B grubu üye sayısı: 30 olarak düşünelim.
                //A Grubu: 70 Üye
                //B Grubu: 30 Üye
                for (int i = 0; i <= checkedListBox1.Items.Count; i++)
                {
                    //Ve asıl önemli yere geldik. İstediğim şey listbox'ta sadece A grubu üyelerinin kalması.
                    //Burada sizin yazdığınız kodları değiştirerek istediğim şeyi yaptım.
                    if (checkedListBox1.Items.Count > RastgeleSayi1)
                    {
                        //uygulama listboxtaki üyeleri gerçekten de gruplara ayırmadığı, bunu göstermelik yaptığı için hangi üyeleri sildiği önemli değil.
                        //bende bu yüzden B grubundaki üye sayısı kadar listenin en başındaki üyeleri silsin diye parantez içindeki "random_number_2"'yi değiştirdim.
                        //Parantez içine 1 yazıyorum ki 1. üyeyi silince 2. üye en üste yani 1. sıraya gelecek ve onuda silicek.
                        //Mesela 5 yazsaydım belki toplam üye sayısı 4, nasıl silecek? Tabikide silemeyecek.
                        //Anladığım kadarıyla sizin yaptığınızda rastgele gelen sayıyı üyenin sıra numarası olarak düşünüp onu siliyorduk.
                        checkedListBox1.Items.RemoveAt(1);
                        //bu şekilde çok stabil çalışmıyor ama benim için önemli değil.
                    }
                }

            }

Tekrardan teşekkür ederim.
 
Son düzenleme:
@300319 Dayanamadım tekrar yazdım. 😅

C#:
//uygulamanın amacını şöyle düşünün, bu listboxtaki elemanları rastgele şekilde A ve B grubu olarak ayırıyor.
            //Öncelikle burada A grubu için rastgele bir sayı üretiyor.
            Random rnd = new Random();
            int RastgeleSayi1 = rnd.Next(0, checkedListBox1.CheckedItems.Count);
            //Sonrasında da B grubu için. Ama bu rastgele değil. Toplam üye sayısından A grubundakileri çıkarıyor ki ayırma artansız gerçekleşsin.
            int RastgeleSayi2 = (checkedListBox1.Items.Count - RastgeleSayi1);
            //sonra formdaki progressbar'a değer ekliyor ve bu değer 1000'e ulaşınca diğer işlemleri gerçekleştiriyor.
            siticoneProgressBar1.Value += 100;
            if (siticoneProgressBar1.Value == 1000)
            {
                //Sürekli kodları baştan tekrarlamasın diye timer'i kapatıyorum
                timer2.Enabled = false;
                //sonrasında işlem bir daha tekrarlanabileceği için progressbar'ı sıfırlıyorum
                siticoneProgressBar1.Value = 0;
                //başta gruplara ayırdığımız item sayılarını labellara yazıyor.
                //label6 A grubunun üye sayısını,
                label6.Text = RastgeleSayi1.ToString();
                //label7 ise B grubunun üye sayısını temsil ediyor.
                label8.Text = RastgeleSayi2.ToString();
                //bunun sonunda formumda labelları koyduğum yerde şu şekilde bir yazı oluyor: (A grubu üye sayısı: 70, B grubu üye sayısı: 30 olarak düşünelim.
                //A Grubu: 70 Üye
                //B Grubu: 30 Üye
                for (int i = 0; i <= checkedListBox1.Items.Count; i++)
                {
                    //Ve asıl önemli yere geldik. İstediğim şey listbox'ta sadece A grubu üyelerinin kalması.
                    //Burada sizin yazdığınız kodları değiştirerek istediğim şeyi yaptım.
                    if (checkedListBox1.Items.Count > RastgeleSayi1)
                    {
                        //uygulama listboxtaki üyeleri gerçekten de gruplara ayırmadığı, bunu göstermelik yaptığı için hangi üyeleri sildiği önemli değil.
                        //bende bu yüzden B grubundaki üye sayısı kadar listenin en başındaki üyeleri silsin diye parantez içindeki "random_number_2"'yi değiştirdim.
                        //Parantez içine 1 yazıyorum ki 1. üyeyi silince 2. üye en üste yani 1. sıraya gelecek ve onuda silicek.
                        //Mesela 5 yazsaydım belki toplam üye sayısı 4, nasıl silecek? Tabikide silemeyecek.
                        //Anladığım kadarıyla sizin yaptığınızda rastgele gelen sayıyı üyenin sıra numarası olarak düşünüp onu siliyorduk.
                        checkedListBox1.Items.RemoveAt(1);
                        //bu şekilde çok stabil çalışmıyor ama benim için önemli değil.
                    }
                }

            }

Tekrardan teşekkür ederim.

Elinize sağlık.

Rica ederim, ne demek.
 

Technopat Haberler

Yeni konular

Geri
Yukarı