2010-06-01 36 views
9

Cơ sở dữ liệu của Khách hàng của chúng tôi trả về một bộ giá trong một mảng, nhưng đôi khi chúng không bao gồm tất cả giá, nghĩa là chúng thiếu các phần tử trong mảng của chúng. Chúng tôi trả lại những gì chúng tôi tìm thấy là một IList, hoạt động tuyệt vời khi chúng tôi truy xuất nội dung từ cơ sở dữ liệu. Tuy nhiên, chúng tôi đang gặp khó khăn trong việc thiết lập các phần tử ở vị trí thích hợp trong mảng.Thêm mục IList vào một số chỉ mục cụ thể

Có thể tạo một IList sau đó thêm một phần tử tại một vị trí cụ thể trong IList không?

var myList = new List<Model>(); 
var myModel = new Model(); 
myList[3] = myModel; // Something like what we would want to do 
+0

Câu hỏi của bạn không phải là rất rõ ràng. Tôi đã trả lời những gì tôi nghĩ * bạn đang hỏi, nhưng nếu bạn có thể giải thích một chút về những gì bạn đang cố gắng làm, tôi có thể cung cấp một câu trả lời tốt hơn. –

+0

Tôi nghĩ câu trả lời là sự kết hợp giữa Matt và Ismail. Tôi muốn chèn một mục vào vị trí 3, nhưng không có gì trong danh sách tồn tại. Theo câu trả lời của Matt, tôi cần tạo một danh sách trống trong đó count> index tôi muốn chèn, sau đó cần sử dụng câu trả lời của Ismail để thực sự chèn nó. Vấn đề khác là chèn sẽ đẩy tất cả những thứ ở trên nó lên một, vì vậy tôi gần như cần phải tạo ra bất kỳ mục bị thiếu trước khi 3, sau đó .Thêm(). Vâng, ít nhất đó là những gì tôi đang cố gắng làm. LOL –

+0

Bạn không thực sự muốn * chèn * nó mặc dù, phải không? Nếu danh sách có đủ các mục, bạn không chỉ muốn ghi đè lên một mục ở phần tử cụ thể? Đó là những gì "myList [3] = myModel;" làm. –

Trả lời

3

Danh sách phát triển linh hoạt để chứa các mục khi chúng được thêm vào. Bạn sẽ phải khởi tạo danh sách với kích thước được xác định trước. Cách dễ nhất mà tôi có thể nghĩ đến là:

var myList = new Model[100].ToList(); 

Điều đó sẽ cung cấp cho bạn một danh sách có 100 mục, tất cả đều không có giá trị. Sau đó bạn được tự do gán một giá trị cho myList [3].

Lưu ý rằng trong mã của bạn, bạn đang cố gắng tạo nhanh IList<Model> không thể thực hiện được - bạn cần loại bê tông (như List<Model>) thay vì giao diện.

+0

Những gì tôi muốn làm là gắn một mục mới ở vị trí 3, nhưng rõ ràng các danh sách cần phải tiếp giáp, vì vậy tôi cần phải tạo các mục trống ở các vị trí thấp hơn 3 rồi chèn một mục mới. –

+0

Ok, vì vậy câu trả lời của tôi là một cách để làm điều đó. Prepopulate danh sách với các mục null (lên đến số tiền tối đa bạn nghĩ rằng bạn sẽ cần) sau đó chỉ định những cái bạn muốn. –

17

Sử dụng IList<T>.Insert(int index,T item)

IList<string> mylist = new List<string>(15); 
mylist.Insert(0, "hello"); 
mylist.Insert(1, "world"); 
mylist.Insert(15, "batman"); // This will throw an exception. 

Từ MSDN

Nếu chỉ số tương đương với số lượng của các mục trong IList, sau đó mục được thêm vào danh sách.

Trong tập hợp các phần tử tiếp giáp, chẳng hạn như danh sách, các yếu tố theo sau điểm chèn di chuyển xuống để chứa phần tử mới. Nếu bộ sưu tập được lập chỉ mục, các chỉ mục của các phần tử được di chuyển cũng được cập nhật. Hành vi này không áp dụng cho các bộ sưu tập trong đó các phần tử được nhóm theo khái niệm thành các nhóm, chẳng hạn như bảng băm.

0

Nó sẽ chèn và thay đổi kích thước nếu cần

public static IList<T> InsertR<T>(this IList<T> ilist, int index, T item) { 

     if (!(index < ilist.Count)) { 

      T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

      ilist.CopyTo(array, 0); 

      array[index] = item; 

      if (ilist.GetType().IsArray) { 
       ilist = array; 
      } else { 
       ilist = array.ToList(); 
      } 


     } else 
      ilist[index] = item; 

     return ilist; 

    } 

hoặc

public static IList InsertR<T>(this IList ilist, int index, T item) { 

      if (!(index < ilist.Count)) { 

       T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

       ilist.CopyTo(array, 0); 

       array[index] = item; 

       if (ilist.GetType().IsArray) { 
        ilist = array; 
       } else { 
        ilist = array.ToList(); 
       } 


      } else 
       ilist[index] = item; 

      return ilist; 

     } 
Các vấn đề liên quan