metoda dizi gönderip dizi almak

Başlatan forumsad, 24 Ekim 2012, 09:11:11

forumsad

form1;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            basla();
        }

        public  int[] sayilar = new int[3];
        public int[] sonuc = new int[3];
        public void basla()
        {
            sayilar[1] = 5;
            sayilar[2] = 6;

            Class1 cls1 = new Class1();

            sonuc[1] = cls1.islemYap(sayilar);  //burda gelen diziyi nasıl alacağız

        }
    }
}



class1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    class Class1
    {
      
        public int[] islemYap(params int[] glnDizi)
        {
            glnDizi[1] = glnDizi[1] + 1;
            glnDizi[2] = glnDizi[2] + 1;
            return glnDizi;
        }
    }
}


arkadaşlar metoda dizi gönderip birtakım işlemler yaptırdıktan sonra diziyi geri almam lazım  bu konuda yardımcı olurmusunuz

saygılar

fatih6761

Kodunuzda hatalar var. Eğer sadece metoda verilen dizinin üstünde değişiklik yapılacaksa geri değer döndürmeye gerek yok.
Dizinin elemanları değiştirmesi yeterli. Ama illâki dizi döndüreceğim diyorsanız diziyi değiştirmek için C deki gibi pointer'ını göndermelisiniz.
.Net'te GC bu işi güvenli yoldan yapabilmesi için parametreye "ref" önekinin eklenmesi gerekir.
public int[] IslemYap(ref int[] dizi)
{
    dizi[0]++;
    dizi[1] = dizi[1] * dizi[0];
    //...
    return dizi;
}


Bu metodu kullanımınız da hatalı:
public void basla()
{
    sayilar[1] = 5;
    sayilar[2] = 6;
    Class1 cls1 = new Class1();

    sonuc = cls1.islemYap(sayilar);

}


Not : Dizinin elemanlarının tek tek işleyebilmek için "yield" kullanabilirsiniz. [ .Net 4.x LINQ Technologies ]

forumsad

public int[] IslemYap(ref int[] dizi)
{
    dizi[0]++;
    dizi[1] = dizi[1] * dizi[0];
    //...
    return dizi;
}


düzelttiğiniz bu şekli kullanarak dönen değerleri listbox içine atabilirmisiniz

saygılarımla

ULAGA

Forma bir adet 'btnBindListBox' adında Button ekledim.
Bir adet de 'lbArray' adında ListBox ekledim.


Form1.cs
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void btnBindListBox_Click(object sender, EventArgs e)
		{
			int[] diziSayi = new int[3];
			diziSayi[0] = 1;
			diziSayi[1] = 2;
			diziSayi[2] = 3;
			OperateArray _OperateArray = new OperateArray();
			_OperateArray.Multiple(ref diziSayi);
			lbArray.DataSource = diziSayi;
		}
	}
}



OperateArray.cs
public class OperateArray
{
	public void Multiple(ref int[] diziSayi)
	{
		diziSayi[0] *= diziSayi[0];
		diziSayi[1] *= diziSayi[1];
		diziSayi[2] *= diziSayi[2];
	}
}

forumsad

#4
teşekkürler hocam

saygılar sunarım

mesaj birleştirme:: 24 Ekim 2012, 22:48:22

hocam sizin kodu biraz kurcaladım bir şeyler yaptım tam istediğim gibi oldu hata vermedende çalışıyor

ama dogru bir yöntem mi bilmiyorum...

form1;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace uygulama
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        int[] puanlar = new int[3];
        int[] tpPuanlar = new int[3];
        private void button1_Click(object sender, EventArgs e)
        {
            puanlar[1] = 1;
            puanlar[2] = 2;

            hesaplama hsp = new hesaplama();
            hsp.islemYap(ref tpPuanlar,puanlar);

            listBox1.Items.Add(tpPuanlar[1].ToString());
            listBox1.Items.Add(tpPuanlar[2].ToString());


        }
    }
}


burda metoda bir diziyi referans olarak diğer diziyide direkt gönderdim
dönen degerleri listbox'a attım


harici class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace uygulama
{
    class hesaplama
    {
        public void islemYap(ref int[] tpPuanlar, params int[] puanlar)
        {
            tpPuanlar[1] = puanlar[1] *2;
            tpPuanlar[2] = puanlar[2] *2;
        }
    }
}


bu şekilde kullanmanın sakıncası yoksa benim işimi görüyor

saygılarımla

fatih6761

public void islemYap(ref int[] tpPuanlar, params int[] puanlar)
{
    tpPuanlar[1] = puanlar[1] *2;
    tpPuanlar[2] = puanlar[2] *2;
}

Burada hep params kullanıyorsunuz. "params", sayısı bilinmeyen parametreleri yollamak için kullanılır. Siz sadece bir dizi atacaksınız. Doğrusu şu şekilde:
public void islemYap(ref int[] tpPuanlar, int[] puanlar)
{
    tpPuanlar[1] = puanlar[1] *2;
    tpPuanlar[2] = puanlar[2] *2;
}

ULAGA

@fatih6761 arkadaşımın da dediği gibi, params ile kullanmanız çok önemli mi?