2011-12-13 36 views
7

Nếu tôi khai báo Danh sách C#. Hãy tăng dung lượng lên 1000. Bây giờ, nếu tôi muốn thêm phần tử trực tiếp vào chỉ mục 1. Tôi không thể làm điều đó. Lỗi ném. Có lựa chọn thay thế nào không?Thêm thành viên vào Danh sách C# bằng cách sử dụng các chỉ mục

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

Cách thay thế tốt nhất mà tôi tìm thấy là thông qua mảng.

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

Không thể thực hiện, sử dụng phương thức Add(). –

+2

Nếu đó là một danh sách thưa thớt (chẳng hạn như 10,20 mục nằm rải rác trong phạm vi 1000), bạn có thể thực sự đang tìm kiếm một 'Từ điển ' thay vì một Danh sách. –

+0

@ssg Yup nó là một danh sách thưa thớt. Sử dụng Dictionary là một gợi ý tốt. Nhưng sau đó tôi sẽ sử dụng nhiều không gian hơn. Bất cứ điều gì đơn giản hơn? – user1041086

Trả lời

2

Bạn có thể sử dụng phương pháp Insert(), như dưới đây:

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

Đưa ra lỗi cho tôi. Bạn cũng nhận được nó? – user1041086

+0

Bạn đang gặp phải lỗi gì? – danludwig

+0

-1 Bạn không thể chèn tại một vị trí nhỏ hơn Đếm, cũng không phải là anh ta cố gắng để thực hiện một chèn mà sẽ thay đổi offsets của tất cả mọi thứ sau khi mục đó. –

3

Giải pháp thay thế tốt nhất mà tôi tìm thấy là thông qua mảng.

đúng, hầu hết sẽ sử dụng một mảng cho điều này khi bạn chứng minh ...

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

Các tùy chọn khác là để kiểm tra giới hạn trước khi thiết lập các yếu tố danh sách ...

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 chỉ preallocates bộ nhớ để danh sách có thể phát triển đến giới hạn dung lượng mà không phải chịu thêm phân bổ bộ nhớ và phân mảnh heap liên quan. Thiết lập List.Capacity thành 1000 không làm cho 1000 mục có thể truy cập được. List.Count cho biết kết thúc của nội dung danh sách thực tế. List.Insert() không thể được sử dụng để chèn các mục vượt quá List.Count.

Cách giải quyết của bạn trong việc tạo một mảng 1000 mục và sau đó chuyển sang danh sách chỉ đơn giản là một phím tắt để gọi List.Add() 1000 lần để phân bổ các vị trí trống trong danh sách (đẩy List.Count to 1000). Calling List.Add() 1000 lần là bộ nhớ hiệu quả hơn, vì với kỹ thuật mảng sẽ có 2 bản sao của danh sách trong bộ nhớ (1 cho mảng, và 1 cho danh sách).

Bạn đã giảm giá đề xuất sử dụng Dictionary<int, sometype> cho mảng thưa bởi vì nó sẽ sử dụng nhiều bộ nhớ hơn mảng thưa dân cư. Điều đó phụ thuộc vào cách dữ liệu của bạn thưa thớt. Nếu bạn chỉ có 100 mục trong phạm vi chỉ mục là 0..1000, bạn có mật độ 10%. Bạn cũng có thể gọi 90% bộ nhớ bị lãng phí đó.

Một từ điển gần như chắc chắn sẽ có nhiều bộ nhớ hiệu quả hơn cho mảng thưa mật độ thấp hơn phân bổ một mảng 1000 mục nhưng chỉ sử dụng 100 trong số các vị trí. Tôi không biết chi tiết cụ thể về việc sử dụng bộ nhớ hoặc sử dụng bộ nhớ của từ điển, nhưng có thể đoán là nếu mật độ mảng thưa thớt của bạn là 50% hoặc cao hơn, sử dụng mảng thay vì từ điển giành được cho bộ nhớ và tốc độ.

1

Chỉnh sửa câu trả lời của csharptest.net.

List<sometype> myList = new List<sometype>() 
while (index >= myList.Count) 
    myList.Add(default(sometype)); //fill with empty 
myList[1] = element; 
Các vấn đề liên quan