2013-07-20 50 views
7

tôi có như sau:Có thể sửa đổi Danh sách trong khi lặp qua danh sách không?

 foreach (var depthCard in depthCards) 
      { 
       var card = InternalGetCard(db, depthCard.CardId); 
       var set = InternalGetSet(db, (int)card.ParentSetId); 
       var depthArray = InternalGetDepthArrayForCard(db, set.SetId); 
       foreach (var cardToUpdate in set.Cards) 
       { 
        // do stuff 
        SaveChanges(db); 
        depthCards.Remove(depthCardToUpdate); // since I already took care of it here, remove from depthCards 
       } 
      } 

này không hoạt động mặc dù bởi vì tôi đang điều chỉnh việc thu thập ở giữa một vòng lặp. Câu hỏi của tôi là ... có một số loại bộ sưu tập nào cho phép loại truy cập này không?

Tôi không muốn ToList() các depthCards vì tôi đã có chúng và tôi muốn để sửa đổi danh sách đó khi tôi đang lặp lại. Có thể không?

Trả lời

18

Có thể, các trick là để lặp ngược:

for (int i = depthCards.Count - 1; i >= 0; i--) { 
    if (depthCards[i] == something) { // condition to remove element, if applicable 
    depthCards.RemoveAt(i); 
    } 
} 
7

Bạn có thể lặp ngược với một for -loop

for (int i = depthCards.Count - 1; i >= 0; i--) 
{ 
    depthCards.RemoveAt(i); 
} 

Bạn cũng có thể sử dụng List.ForEach mà cho phép sửa đổi danh sách trên lần lặp lại:

depthCardToUpdate.ForEach(dc => depthCardToUpdate.Remove(dc)); 

hoặc nếu bạn chỉ muốn xoá các mục trên một điều kiện, sử dụng List.RemoveAll:

depthCardToUpdate.RemoveAll(dc => conditionHere); 
+0

thể luôn thêm một 'ở đâu() 'tuyên bố trong trước khi thực hiện' foreach() 'để thu hẹp kết quả trước loại bỏ chúng, nếu nó loại bỏ điều kiện. –

+0

@Bob .: Không, bởi vì sau đó nó sẽ không còn là một 'Danh sách ' nữa nhưng một 'IEnumerable 'không hỗ trợ phương thức' List.ForEach'. Bạn chỉ có thể sử dụng 'foreach' sau đó, nhưng sau đó nó không thể sửa đổi danh sách trong vòng lặp. –

+0

Đó không phải là những gì 'ToList()' là dành cho? –

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