2011-12-13 18 views
7

Bir C# Listesi bildirirse. Kapasitesini 1000 olarak yapın. Şimdi, doğrudan dizin 1'e bir eleman eklemek istiyorum. Bunu yapamıyorum. Fırlatma hatası. Mevcut alternatifler var mı?C# List dizinlerine üye ekleme

List<sometype> myList = new List<sometype>() 
    myList.capacity = 1000; 
    myList[1] = element; //exception thrown 

Bulduğum en iyi alternatif, dizi üzerinden gerçekleşiyor.

sometype[] myarray = new sometype[1000]; 
    myarray[1] = element; 
    //after filling whole array 
    myarray.ToList(); 
+0

Yok, Add() yöntemini kullanın. –

+2

Eğer seyrek bir liste iseniz (1000 aralığındaki 10,20 öğe gibi), aslında bir Liste yerine bir 'Sözlük ' araması yapabilirsiniz. –

+0

@ssg Yup, seyrek liste. Sözlük kullanmak iyi bir öneridir. Ama sonra daha fazla alan kullanıyorum. Daha basit bir şey var mı? – user1041086

cevap

2

aşağıdaki gibi takın() yöntemini kullanabilirsiniz:

myList.Insert(1, element); //1 is the index 
0
List<sometype> myList = new List<sometype>() 
myList.capacity = 1000; 
myList.Add(null); 
myList.Add(null); 
myList.Insert(1, element); //exception not thrown 
+0

Bana bir hata verir. Sen de mi alıyorsun? – user1041086

+0

Hangi hatayı alıyorsunuz? – danludwig

+0

-1 Count'tan daha düşük bir konuma yerleştiremezsiniz, ayrıca o öğeden sonra her şeyin ofsetini değiştirecek bir ekleme yapmaya çalışamaz. –

3

buldum iyi alternatiftir dizisi geçer.

Doğru, sen gösterildiği gibi çoğu bunun için bir dizi kullanacak ...

sometype[] myarray = new sometype[1000]; 
myarray[1] = element; 

Diğer seçenek listesi elemanı ayarlamadan önce sınır kontrol etmektir ...

List<sometype> myList = new List<sometype>() 
myList.capacity = 1000; 
if(ix < myList.Count) 
    myList[1] = element; //replace element 
else 
{ 
    while(myList.Count < (ix-1)) 
     myList.Add(default(sometype)); //fill with empty 

    myList.Add(element); 
} 
5

List.Capacity sadece belleği önceden belleğe alır, böylece liste ek bellek ayırmalarına ve ilişkili yığın parçalanmalarına neden olmadan kapasite sınırına çıkabilir. List.Capacity 1000'e ayarlandığında 1000 giriş erişilebilir değildir. List.Count, gerçek liste içeriklerinin sonunu gösterir. List.Insert(), List.Count ötesine öğeler eklemek için kullanılamaz.

1000 öğeden oluşan bir dizi oluşturma ve sonra da bir listeye dönüştürme geçici çözümünüz, listeden boş yuvaları ayırmak için List.Add() öğesini 1000 kez çağırmak için bir kısayoldur (List.Count öğesini 1000'e getirin). Calling List.Add() 1000 kere daha fazla hafızaya sahiptir, çünkü dizi tekniği ile listenin hafızasında 2 kopya olacaktır (dizi için 1 ve liste için 1).

Seyrek bir dizi için Dictionary<int, sometype> kullanma önerisi indirgenmiştir, çünkü seyrek nüfuslu bir diziden daha fazla bellek kullanır. Bu, verilerinizin ne kadar seyrettiğine bağlı. 0..1000 dizin aralığında yalnızca 100 öğeniz varsa,% 10 yoğunluğa sahipsiniz. Ayrıca% 90 boşa harcanmış bellek de diyebilirsiniz.

Bir sözlük, 1000 yoğunluklu bir dizi ayırmaktan ziyade yalnızca 100 yuva kullanarak, düşük yoğunluklu seyrek dizi için neredeyse daha fazla bellek verimli olacaktır. Sözlük uygulamasının veya bellek kullanımının özelliklerini bilmiyorum, ancak muhtemelen bir tahmin, eğer seyrek dizinizin yoğunluğu% 50 veya daha fazla ise, bir sözlük yerine bir dizi kullanmak, bellek ve hız için kazanır.

1

csharptest.net'in yanıtını düzenleyin.

List<sometype> myList = new List<sometype>() 
while (index >= myList.Count) 
    myList.Add(default(sometype)); //fill with empty 
myList[1] = element; 
İlgili konular