none
Dizilerin boyutlarını kullanıcın ayarlaması RRS feed

  • Soru

  • Merhaba arkadaşlar,, dizilerin boyutlarını kullanıcının ayarlamasını istiyorum,, bunun için nasıl bir yöntem gerekiyor?

    Mesela, kullanıcı 3 boyutlu ve ilk boyut 5 elemanlı, 2. boyut 4 elemanlı, 3.boyut ise 9 elemanlı olsun. Tanımı bu şekilde ama

    int[,,] toplam = new int[5,4,9];

    kullanıcı 2 boyutluda diyebilir 10 boyutluda diyebilir, bu durumda ne yapmamız gerekiyor??

    İlgi ve yardımlarınız için teşekkürler..

    9 Haziran 2013 Pazar 11:58

Yanıtlar

  • Array class'ının CreateInstance adlı bir metodu var ;
    public static Array CreateInstance(Type elementType,int[] lengths)
    Bunu kullanarak istediğin boyutta dizi yaratabilirsin.İşine yarayabilecek metodlar ve propertyler ;
    //Dizinin int tipinde ve 3,5,9 boyutlarında olacağı belirleniyor.
    Array dizi = Array.CreateInstance(typeof(int), new int[] { 3,5,9 });
    
    //Dizinin kaç boyutlu olduğununu öğrenebilirsin
    //Örneğe göre 3
    int boyut = dizi.Rank;
    
    //Dizinin indexe göre boyutların uzunluğunu öğrenebilirsin
    //Örneğe göre sırasıyla 2,4,8
    int ilkBoyut = dizi.GetUpperBound(0);
    int ikinciBoyut = dizi.GetUpperBound(1);
    int ucuncuBoyut = dizi.GetUpperBound(2);
    Umarım yardımcı olmuştur.
    • Yanıt Olarak Öneren Oğuz KURTCUOĞLU 9 Haziran 2013 Pazar 15:59
    • Yanıt Olarak İşaretleyen fatihmert 13 Haziran 2013 Perşembe 21:12
    9 Haziran 2013 Pazar 13:34
  • Bunun bir çok yöntemi var.Eğer WinForm kullanıyorsanız bir TextBox'ınız olur ve dizi boyutlarını şu şekilde alırsınız ; 9,6,15,8 gibi.Sonrasında bu yazıyı split ederek parçalara ayırır ve sayıya çevirilen kısımları listeye eklersiniz.Sonrasında da bu listeyi dizinin boyutu için kullanırsınız ;
    txtSayilar bir TextBox olsun

    List<int> sayilar = new List<int>();
    string[] cevirilecekSayilar = txtSayilar.Text.Split(',');
    foreach(string s in cevirilecekSayilar)
    {
       int sayi = 0;
       //TryParse metodu yazıyı sayıya çevirebilirse true döndürür.Çevirebildiği değeri ise out parametre olarak aktarır.
       if(int.TryParse(s,out sayi))
          sayilar.Add(sayi);
    }
    
    Array dizi = Array.CreateInstance(typeof(int),sayilar.ToArray());

    Eğer Console kullanıyorsanız da bir do while işinizi görecektir ;

    List<int> sayilar = new List<int>();
    do
    {
      Console.WriteLine("Lütfen bir sayı giriniz : ");
      string s = Console.ReadLine();
      int sayi = 0;
      if(int.TryParse(s,out sayi))
        sayilar.Add(sayi);
      else
        Console.WriteLine("Girdiğiniz değer boyut olarak eklenemiyor.");
      Console.WriteLine("Boyut sayısı : {0}",sayilar.Count);
      Console.WriteLine("Başka bir boyut eklemek ister misiniz ? Evet = E & Hayır = H : ");
    }
    //Eğer kişi sayıya çevirilemeyen bir değer girip boyut eklensin mi sorusuna da hayır derse dizin boş kalacağı için sayilar.Count'un sıfıra eşit olup olmadığını da kontrol etmemiz gerek.
    while(sayilar.Count == 0 || Console.ReadKey().Key == ConsoleKey.E) 

    Umarım yardımcı olmuştur.



    • Düzenleyen FatihDoğan 14 Haziran 2013 Cuma 19:03
    • Yanıt Olarak İşaretleyen fatihmert 19 Haziran 2013 Çarşamba 17:56
    14 Haziran 2013 Cuma 18:59

Tüm Yanıtlar

  • Array class'ının CreateInstance adlı bir metodu var ;
    public static Array CreateInstance(Type elementType,int[] lengths)
    Bunu kullanarak istediğin boyutta dizi yaratabilirsin.İşine yarayabilecek metodlar ve propertyler ;
    //Dizinin int tipinde ve 3,5,9 boyutlarında olacağı belirleniyor.
    Array dizi = Array.CreateInstance(typeof(int), new int[] { 3,5,9 });
    
    //Dizinin kaç boyutlu olduğununu öğrenebilirsin
    //Örneğe göre 3
    int boyut = dizi.Rank;
    
    //Dizinin indexe göre boyutların uzunluğunu öğrenebilirsin
    //Örneğe göre sırasıyla 2,4,8
    int ilkBoyut = dizi.GetUpperBound(0);
    int ikinciBoyut = dizi.GetUpperBound(1);
    int ucuncuBoyut = dizi.GetUpperBound(2);
    Umarım yardımcı olmuştur.
    • Yanıt Olarak Öneren Oğuz KURTCUOĞLU 9 Haziran 2013 Pazar 15:59
    • Yanıt Olarak İşaretleyen fatihmert 13 Haziran 2013 Perşembe 21:12
    9 Haziran 2013 Pazar 13:34
  • Çok teşekkür ederim fakat bir şey daha soracağım,,

    vermiş olduğunuz örnekte bir tane dizi var bunuda biz belirledik,, bu dizi sayısını da kullanıcının belirlemesini istediğimizde ne yapmamız gerekiyor?

    14 Haziran 2013 Cuma 18:15
  • Bunun bir çok yöntemi var.Eğer WinForm kullanıyorsanız bir TextBox'ınız olur ve dizi boyutlarını şu şekilde alırsınız ; 9,6,15,8 gibi.Sonrasında bu yazıyı split ederek parçalara ayırır ve sayıya çevirilen kısımları listeye eklersiniz.Sonrasında da bu listeyi dizinin boyutu için kullanırsınız ;
    txtSayilar bir TextBox olsun

    List<int> sayilar = new List<int>();
    string[] cevirilecekSayilar = txtSayilar.Text.Split(',');
    foreach(string s in cevirilecekSayilar)
    {
       int sayi = 0;
       //TryParse metodu yazıyı sayıya çevirebilirse true döndürür.Çevirebildiği değeri ise out parametre olarak aktarır.
       if(int.TryParse(s,out sayi))
          sayilar.Add(sayi);
    }
    
    Array dizi = Array.CreateInstance(typeof(int),sayilar.ToArray());

    Eğer Console kullanıyorsanız da bir do while işinizi görecektir ;

    List<int> sayilar = new List<int>();
    do
    {
      Console.WriteLine("Lütfen bir sayı giriniz : ");
      string s = Console.ReadLine();
      int sayi = 0;
      if(int.TryParse(s,out sayi))
        sayilar.Add(sayi);
      else
        Console.WriteLine("Girdiğiniz değer boyut olarak eklenemiyor.");
      Console.WriteLine("Boyut sayısı : {0}",sayilar.Count);
      Console.WriteLine("Başka bir boyut eklemek ister misiniz ? Evet = E & Hayır = H : ");
    }
    //Eğer kişi sayıya çevirilemeyen bir değer girip boyut eklensin mi sorusuna da hayır derse dizin boş kalacağı için sayilar.Count'un sıfıra eşit olup olmadığını da kontrol etmemiz gerek.
    while(sayilar.Count == 0 || Console.ReadKey().Key == ConsoleKey.E) 

    Umarım yardımcı olmuştur.



    • Düzenleyen FatihDoğan 14 Haziran 2013 Cuma 19:03
    • Yanıt Olarak İşaretleyen fatihmert 19 Haziran 2013 Çarşamba 17:56
    14 Haziran 2013 Cuma 18:59