2010-06-29 29 views
5

Tôi có điều này và tất cả dường như làm việc tốt nhưng không chắc chắn lý do tại sao và nếu nó hợp lệ.C# - Loại bỏ các mục từ điển trong khi vòng lặp

 Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 

     while (test.Count > 0) 
     { 
      var obj = test.Last(); 
      MyMethod(obj); 
      test.Remove(obj.Key); 
     } 

Cập nhật: Cảm ơn câu trả lời, tôi đã cập nhật mã của tôi để giải thích lý do tại sao tôi không làm Dictionary.Clear();

Trả lời

10

Không có gì sai với việc thay đổi loại bộ sưu tập trong một vòng lặp while theo cách này. Nơi bạn gặp rắc rối là khi bạn thay đổi bộ sưu tập trong một khối foreach. Hoặc thường sử dụng một IEnumerator<T> sau khi bộ sưu tập cơ bản bị đột biến.

Mặc dù trong mẫu này nó sẽ có rất nhiều đơn giản hơn để chỉ cần gọi test.Clear() :)

1

đó làm việc, tiền phạt, vì bạn không lặp lại trong từ điển trong khi loại bỏ mặt hàng này. Mỗi khi bạn kiểm tra test.Count, nó giống như nó kiểm tra nó từ đầu.

đó đang được nói, các mã trên có thể được viết đơn giản hơn nhiều và hiệu quả hơn:

test.Clear(); 
1

Nó hoạt động vì Đếm sẽ được cập nhật mỗi khi bạn xóa một đối tượng. Vì vậy, nói số đếm là 3, test.Remove sẽ làm giảm số đếm thành 2, và cứ thế, cho đến khi số đếm là 0, thì bạn sẽ thoát ra khỏi vòng lặp

0

Tất cả những gì bạn đang làm là lấy mục cuối cùng trong bộ sưu tập và xóa nó cho đến khi không có thêm mục nào còn lại trong Từ điển.

Không có gì ngoài bình thường và không có lý do gì nó không hoạt động (miễn là dọn sạch bộ sưu tập là những gì bạn muốn làm).

0

Vì vậy, bạn chỉ đang cố gắng xóa từ điển, đúng không? Bạn không thể làm như sau?

Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 
     test.Clear(); 
0

Điều này có vẻ như nó sẽ hoạt động, nhưng có vẻ rất tốn kém. Điều này sẽ là một vấn đề nếu bạn đang lặp lại nó với một vòng lặp foreach (bạn không thể chỉnh sửa bộ sưu tập khi đang lặp lại).

Dictionary.Clear() nên thực hiện thủ thuật (nhưng có thể bạn đã biết điều đó).

0

Mặc dù bản cập nhật, bạn có thể có thể vẫn sử dụng rõ ràng ...

foreach(var item in test) { 
    MyMethod(item); 
} 
test.Clear() 

Cuộc gọi của bạn để .Last() sẽ là cực kỳ hiệu quả trên một từ điển lớn, và sẽ không đảm bảo bất kỳ đặt hàng đặc biệt của việc xử lý bất kể (từ điển là một bộ sưu tập không có thứ tự)

8

Tôi không hiểu tại sao bạn đang cố gắng xử lý tất cả các mục nhập Dictonary theo thứ tự ngược lại - nhưng mã của bạn là OK.

Nó có thể là nhanh hơn một chút để có được một danh sách của tất cả các phím và xử lý các mục bằng phím thay vì đếm một lần nữa và một lần nữa ...

V.D.:

var keys = test.Keys.OrderByDescending(o => o).ToList(); 

foreach (var key in keys) 
{ 
    var obj = test[key]; 
    MyMethod(obj); 
    test.Remove(key); 
} 

Dictonarys nhanh khi truy cập bằng giá trị khóa của chúng. Last() là chậm hơn và đếm là không cần thiết - bạn có thể nhận được một danh sách tất cả (duy nhất) phím.

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