none
2D List<List<Kitap>> "Argument is out of range" RRS feed

  • Soru

  • Herkese Merhabalar,

    İç içe list yaparak basit bir life-saver tarzı oygulama örneği denedim. Fakat bir sorun var, butona tıkladığım zaman ilk sefer çalışıyor, ikinci sefer ise "Argument is out of range" hatası veriyor. Thread-safe için null değeri, count vs. kontrolü yapmama rağmen hala hatayı vermekte. "kitaplar[sec].Count" kullandığım yerlerde hata vermekte. Anlamadığım şekilde bir problem var, ilk sefer çalışıyor, ikincide hata veriyor...

            List<List<Kitap>> kitaplar = new List<List<Kitap>>();
            kitaplar = FindConnectedkitaplar(Kitap.KitapTuru.Roman);
            int sec = Random.Range(0, kitaplar.Count);
            for (int i = 0; i < kitaplar[sec].Count; i++)
            {
                if(kitaplar[sec][i] != null)
                {
                    //Çalışacak kodlar...
                }
            }

    Teşekkürler...


    • Düzenleyen lFurkanl 22 Aralık 2015 Salı 14:06
    22 Aralık 2015 Salı 10:24

Yanıtlar

  • @kimi ro,

    Sayilari esit olmasi gerekmiyor ki, gerekiyor mu?.

    sec kitaplar.Count'dan kucuk ise, i de kitaplar[sec].Count'dan kucuk ise neden hata versin?

    Ornek:

    void Main()
    {
       List<List<Kitap>> kitaplar = new List<List<Kitap>>();
       
       var r = new Random();
       for (int i = 0; i < 10; i++)
      {
        var books = Enumerable.Range(1, r.Next(3, 100))
        .Select(e => new Kitap {Name=Guid.NewGuid().ToString()})
        .ToList();
        kitaplar.Add(books);
      }
       
       
      for (int i = 0; i < kitaplar.Count(); i++)
      {
        for (int j = 0; j < kitaplar[i].Count; j++)
        {
          Console.WriteLine("Kitaplar[{0}][{1}]:{2}",i,j,kitaplar[i][j].Name);
        }
      }
    }
    
    public class Kitap
    { 
      public string Name { get; set; }
    }
    


    • Düzenleyen CetinBasozEditor 22 Aralık 2015 Salı 14:58
    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:17
    22 Aralık 2015 Salı 14:50
    Yanıtlayıcı
  • Evet, sorunu çözdüm. Kitaplar Class içince kontrolEdildi diye bir bool vardı. Ben  bunu temizlemediğim için ikinci sefer çalıştığında liste boş oluyordu ve null veriyordu. Çetin hocamın örneğe bakınca hatırladım.

    Peki null olup olmadığını kontrol ederken de hata veriyor bunu anlamadım, şuan vermiyor ama çözmeden önce null mu değil mi hatayı kontrol ederken hata veriyor. Acaba o neden oluyordu ?

    Teşekkürler ...

    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:17
    22 Aralık 2015 Salı 15:17
  • Ben ilk mesajdaki  kodları şöyle anladım:

    if(kitaplar[sec][i] != null)

    kitaplar listesi,içerisinde bir liste elemanı daha barındırıyor , yukarıdaki koddaki i , kitaplar listesi içindeki kitap sublistinin elemanının index numarasını gösteriyor.

    örnek olarak şu kodu çalıştırdığımızda kitaplar listesi içerisindeki List<Kitap> sublistinin eleman sayısını öğrenebiliriz

            int subListCount= 0;
    	foreach (var sublist in kitaplar)
    	{
    	    subListCount+= sublist.Count;
    	}

    Diyelim subListCount sayısı 2 çıktı ve kitaplar listesinin count'uda 10 olsun.İlk mesajdaki for döngüsü en fazla kitaplar listesinin eleman sayısı kadar dönecek(Random fonksiyonundan 10 değeri döndüğünü varsayalım)

    For döngüsü 3. defa çalıştığında if satırındaki değerler böyle olucak:

      if(kitaplar[0][2] != null

    ve sublistteki eleman sayısı 2 olduğu için 3. elemanı([2])  bulamayacak ve "out of range" hatası alınacak.

    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:32
    • Düzenleyen kimi ro 22 Aralık 2015 Salı 15:58
    22 Aralık 2015 Salı 15:25
  • Soyledim ya neden verdigini. Senin sorularini anlamak da cok zor oluyor :)
    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:46
    22 Aralık 2015 Salı 15:35
    Yanıtlayıcı

Tüm Yanıtlar

  • Random.Range ne is yapar? sec = kitaplar.Count ise ne olacak ?
    22 Aralık 2015 Salı 14:29
    Yanıtlayıcı
  • kitaplar listesindeki eleman sayısı ile KitapTuru listesindeki eleman sayısı birbirinden farklı o yüzden bu satırda hata alıyorsunuz:

      if(kitaplar[sec][i] != null)

    22 Aralık 2015 Salı 14:38
  • Random.Range ne is yapar? sec = kitaplar.Count ise ne olacak ?

    Random.Range(x,y) -> x ve y dahil olmak üzere int tipinde rastgele veri döndürüyor.

     int sec = Random.Range(0, kitaplar.Count);

    Burada kitapların ilk list'deki sırası kadar rastgele sayı seçiyorum.

    10 Kitap var diyelim, 0 ile 10 arasında rastgele sayı seçiyorum. Orada Count-1 olacak yanlış yazmışım sanırım. "Argument out of range" hatasını ise for döngüsünde gösteriyor. İlk sefer çalışıyor, ikincide hata veriyor, new diyerek sıfırlamama rağmen.

    22 Aralık 2015 Salı 14:39
  • x ve y "dahil" olmak uzere int tipinde rastgele veri donduruyorsa o zaman gelen sayi y yani kitaplar.Count olabilir demek degil mi? Oyle ise:

    kitaplar[sec] hata degil mi, soylemek istedigim o idi.

    Not: x ve y "dahil" olmak uzere int tipinde rastgele veri donduruyorsa ne diye oyle bir metod yaratmaya gerek duydun ki? Random'da zaten Next o isi yapmiyor mu?

    22 Aralık 2015 Salı 14:48
    Yanıtlayıcı
  • @kimi ro,

    Sayilari esit olmasi gerekmiyor ki, gerekiyor mu?.

    sec kitaplar.Count'dan kucuk ise, i de kitaplar[sec].Count'dan kucuk ise neden hata versin?

    Ornek:

    void Main()
    {
       List<List<Kitap>> kitaplar = new List<List<Kitap>>();
       
       var r = new Random();
       for (int i = 0; i < 10; i++)
      {
        var books = Enumerable.Range(1, r.Next(3, 100))
        .Select(e => new Kitap {Name=Guid.NewGuid().ToString()})
        .ToList();
        kitaplar.Add(books);
      }
       
       
      for (int i = 0; i < kitaplar.Count(); i++)
      {
        for (int j = 0; j < kitaplar[i].Count; j++)
        {
          Console.WriteLine("Kitaplar[{0}][{1}]:{2}",i,j,kitaplar[i][j].Name);
        }
      }
    }
    
    public class Kitap
    { 
      public string Name { get; set; }
    }
    


    • Düzenleyen CetinBasozEditor 22 Aralık 2015 Salı 14:58
    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:17
    22 Aralık 2015 Salı 14:50
    Yanıtlayıcı
  • Evet, sorunu çözdüm. Kitaplar Class içince kontrolEdildi diye bir bool vardı. Ben  bunu temizlemediğim için ikinci sefer çalıştığında liste boş oluyordu ve null veriyordu. Çetin hocamın örneğe bakınca hatırladım.

    Peki null olup olmadığını kontrol ederken de hata veriyor bunu anlamadım, şuan vermiyor ama çözmeden önce null mu değil mi hatayı kontrol ederken hata veriyor. Acaba o neden oluyordu ?

    Teşekkürler ...

    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:17
    22 Aralık 2015 Salı 15:17
  • Ben ilk mesajdaki  kodları şöyle anladım:

    if(kitaplar[sec][i] != null)

    kitaplar listesi,içerisinde bir liste elemanı daha barındırıyor , yukarıdaki koddaki i , kitaplar listesi içindeki kitap sublistinin elemanının index numarasını gösteriyor.

    örnek olarak şu kodu çalıştırdığımızda kitaplar listesi içerisindeki List<Kitap> sublistinin eleman sayısını öğrenebiliriz

            int subListCount= 0;
    	foreach (var sublist in kitaplar)
    	{
    	    subListCount+= sublist.Count;
    	}

    Diyelim subListCount sayısı 2 çıktı ve kitaplar listesinin count'uda 10 olsun.İlk mesajdaki for döngüsü en fazla kitaplar listesinin eleman sayısı kadar dönecek(Random fonksiyonundan 10 değeri döndüğünü varsayalım)

    For döngüsü 3. defa çalıştığında if satırındaki değerler böyle olucak:

      if(kitaplar[0][2] != null

    ve sublistteki eleman sayısı 2 olduğu için 3. elemanı([2])  bulamayacak ve "out of range" hatası alınacak.

    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:32
    • Düzenleyen kimi ro 22 Aralık 2015 Salı 15:58
    22 Aralık 2015 Salı 15:25
  • Soyledim ya neden verdigini. Senin sorularini anlamak da cok zor oluyor :)
    • Yanıt Olarak İşaretleyen lFurkanl 22 Aralık 2015 Salı 15:46
    22 Aralık 2015 Salı 15:35
    Yanıtlayıcı
  • Soyledim ya neden verdigini. Senin sorularini anlamak da cok zor oluyor :)

    Hocam sanırım ben anlatamıyorum her seferinde. Ben okuduğumda anlıyorum, ama kendi problemim olduğu için. Kod bilgisi eksikliğinden değilde, bazı problemleri çözmek için bazı algoritmalar kullanılıyor mesela. Algoritma olsa ben onu birşekilde yazarım fakat sorun kod'a dökmekte değil hiç başlayamamakta.

    Tübitak gibi soru sormuyorum en azından. (: Teşekkürler yardımlarınız için...

    22 Aralık 2015 Salı 15:49