none
Listbox1 deki sayıları Listbox2 ye sıralı aktarma RRS feed

  • Soru

  • Herkese merhaba üniversite 1. sınıf öğrencisiyim bir ödevim var ve sizlere danışmak istedim 
    Ödevim şu : textbox1 den girilen sayıları Listbox1 e ekleyecek ve Sırala butonuna basıncada Listbox2 ye sıralı olarak atacak uğraştım bir şeyler yaptım ancak textbox dan listbox1 e ekliyorum ve listbox1 deki sayıları sırala(küçükten büyüğe) butonuna basınca sayılar karşıya 0 şeklinde geçiyor yani eklediğim sayı kadar listbox2 de sıfır sıralanıyor bunun sebebi nedir ? 
    kodlar bunlar. şimdiden teşekkürler

    private void button1_Click(object sender, EventArgs e)

    {     

          listBox1.Items.Add(textBox1.Text);

    }       

    private void button2_Click(object sender, EventArgs e)

    {

    int gecici;

    int[] sayilar = new int[listBox1.Items.Count];

    for (int i = 0; i < listBox1.Items.Count; i++)

    {

    for (int s = i + 1; s < listBox1.Items.Count; s++)

    {

    if (sayilar[i] > sayilar[s])

    {

    gecici = sayilar[s];

    sayilar[s] = sayilar[i];

    sayilar[i] = gecici;

    }

    }

    }

    foreach (int sayi in sayilar)

    {

    listBox2.Items.Add(sayi);

    }

    }

    }

    }



    • Düzenleyen Emre Akyol 18 Mayıs 2016 Çarşamba 10:59
    18 Mayıs 2016 Çarşamba 10:57

Yanıtlar

  • Neden hep sifir aliyorsun? Koduna dikkatli bakarsan, "sayilar" dizisini listbox1'in item sayisi kadar olacak sekilde baslatiyorsun, ancak onun disinda listbox1 ile ilgili hicbir sey yapmiyorsun. Yani elinde her zaman listbox1'in eleman sayisi kadar 0 oluyor. Onlari siralayinca da aldigin sadece 0'lar. 

    Bu sekildeki bir yaklasim senin isini zorlastirir.

    Bak aslinda cevabi sorunda gizli. " ... sayilari listbox1'e ekleyecek ..." diyorsun. Yani isin icinde "sayi" var, ama senin listboxa eklediklerin .Text yani string. Sayilari sayi olarak siralarsan 1,2,3... alirsin. Ancak string olarak siralarsan 1,11,12,2,21,3 ... gibi alfabetik bir siralama alirsin. Birincisi bu.

    Ikincisi, siralamayi Listbox'ta yapacagina, sayilari bir kaynak 'liste'de tutsan ( array, List gibi) ve bu kaynagi Listbox'in datasource'u yapsan, o listede dile entegre edilmis sorgulamayi kullanabilirsin.

    Son olarak, sayi girisinde basit bir kontrol yapip int32 olmayanlari 0 kabul etmek olabilir mesela.

    Bunlari birlestirirsen.

    private List<int> sayilar=new List<int>();

    diye bir liste tutarsin.

    Ekle butonuna clicklediginde sayilar'a int cevirimi yaparak ekler ve listBox1 datasource'unu kurarsin:

    private void button1_Click(object sender, EventArgs e)
    {
    	int sayi;
    	int.TryParse(textBox1.Text, out sayi);
    	sayilar.Add(sayi);
    	listBox1.DataSource = null;
    	listBox1.DataSource = sayilar;
    }

    Siralama butonuna tiklaninca, basitce "sayilar" listeni siralayip, listBox2'ye datasource olarak atarsin:

    private void button2_Click(object sender, EventArgs e)
    {
    	listBox2.DataSource = null;
    	listBox2.DataSource = sayilar.OrderBy(s => s).ToList();
    }


    18 Mayıs 2016 Çarşamba 12:12
    Yanıtlayıcı

Tüm Yanıtlar

  •  private void BtnSirala_Click(object sender, EventArgs e)
            {
                ArrayList lst= new ArrayList();
                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    lst.Add(Convert.ToInt32(listBox1.Items[i]));
                }
                lst.Sort();
                foreach (var item in lst)
                {
                    listBox2.Items.Add(item);
                }
            }

    18 Mayıs 2016 Çarşamba 11:31
  • public void QuickSort(int[] dizi, int baslangic, int bitis)
            {
                int i;
                if (baslangic < bitis)
                {
                    i = partition(dizi, baslangic, bitis);
                    QuickSort(dizi, baslangic, i - 1);
                    QuickSort(dizi, i + 1, bitis);
                }
     
            }
            public int partition(int[] A, int baslangic, int bitis)
            {
                int gecici;
                int x = A[bitis];
                int i = baslangic - 1;
     
                for (int j = baslangic; j <= bitis - 1; j++)
                {
                    if (A[j] <= x)
                    {
                        i++;
                        gecici = A[i];
                        A[i] = A[j];
                        A[j] = gecici;
                    }
                }
                gecici = A[i + 1];
                A[i + 1] = A[bitis];
                A[bitis] = gecici;
                return i + 1;

            }

    bunu uyarlayabilirsin. quick sort örneği. istersen sorting algorithms(sıralama algoritmaları) araştırabilirsin. ve bu işleri buton ile değil de alt fonksiyonlarla yapmanı tavsiye ederim butonun içerisine çağırıp yaptırırsın yine

    18 Mayıs 2016 Çarşamba 11:32
  • Neden hep sifir aliyorsun? Koduna dikkatli bakarsan, "sayilar" dizisini listbox1'in item sayisi kadar olacak sekilde baslatiyorsun, ancak onun disinda listbox1 ile ilgili hicbir sey yapmiyorsun. Yani elinde her zaman listbox1'in eleman sayisi kadar 0 oluyor. Onlari siralayinca da aldigin sadece 0'lar. 

    Bu sekildeki bir yaklasim senin isini zorlastirir.

    Bak aslinda cevabi sorunda gizli. " ... sayilari listbox1'e ekleyecek ..." diyorsun. Yani isin icinde "sayi" var, ama senin listboxa eklediklerin .Text yani string. Sayilari sayi olarak siralarsan 1,2,3... alirsin. Ancak string olarak siralarsan 1,11,12,2,21,3 ... gibi alfabetik bir siralama alirsin. Birincisi bu.

    Ikincisi, siralamayi Listbox'ta yapacagina, sayilari bir kaynak 'liste'de tutsan ( array, List gibi) ve bu kaynagi Listbox'in datasource'u yapsan, o listede dile entegre edilmis sorgulamayi kullanabilirsin.

    Son olarak, sayi girisinde basit bir kontrol yapip int32 olmayanlari 0 kabul etmek olabilir mesela.

    Bunlari birlestirirsen.

    private List<int> sayilar=new List<int>();

    diye bir liste tutarsin.

    Ekle butonuna clicklediginde sayilar'a int cevirimi yaparak ekler ve listBox1 datasource'unu kurarsin:

    private void button1_Click(object sender, EventArgs e)
    {
    	int sayi;
    	int.TryParse(textBox1.Text, out sayi);
    	sayilar.Add(sayi);
    	listBox1.DataSource = null;
    	listBox1.DataSource = sayilar;
    }

    Siralama butonuna tiklaninca, basitce "sayilar" listeni siralayip, listBox2'ye datasource olarak atarsin:

    private void button2_Click(object sender, EventArgs e)
    {
    	listBox2.DataSource = null;
    	listBox2.DataSource = sayilar.OrderBy(s => s).ToList();
    }


    18 Mayıs 2016 Çarşamba 12:12
    Yanıtlayıcı