2009-07-22 44 views
25

Cách tốt nhất để đặt tất cả các giá trị trong Từ điển C# là gì?Cách tốt nhất để đặt tất cả các giá trị trong C# Dictionary <string,bool> là gì?

Đây là những gì tôi đang làm bây giờ, nhưng tôi chắc chắn rằng có một/cách tốt hơn sạch hơn để làm điều này:

Dictionary<string,bool> dict = GetDictionary(); 
var keys = dict.Keys.ToList(); 
for (int i = 0; i < keys.Count; i++) 
{ 
    dict[keys[i]] = false; 
} 

Tôi đã thử một số cách khác với foreach, nhưng tôi có lỗi.

+0

Một câu hỏi từ my newb days :) –

Trả lời

60

Đó là một cách tiếp cận hợp lý, mặc dù tôi muốn:

foreach (var key in dict.Keys.ToList()) 
{ 
    dict[key] = false; 
} 

Các cuộc gọi đến ToList() làm công việc này, vì nó kéo ra và (tạm thời) lưu danh sách các phím, vì vậy các công trình lặp đi lặp lại.

+1

Nhìn vào mã ban đầu của tôi, tôi không biết tại sao tôi không thử điều này. –

+2

dict.Keys.ForEach (k => dict [k] = sai); – obenda

+0

@obenda [ForEach được coi là thiệt hại] (https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/). –

-2

Bạn chỉ có thể kéo ra ToList() và lặp trực tiếp trên các mục từ điển

Dictionary<string, bool> dict = GetDictionary(); 
foreach (var pair in dict) 
{ 
    dict[pair.Key] = false; 
} 
+3

Thay đổi từ điển vô hiệu hóa điều tra viên và tiếp tục sử dụng nó sẽ ném một 'InvalidOperationException'. –

-4

làm nó theo cách bạn có nó ngay bây giờ ... foreach là chậm. foreach có thể sạch hơn, nhưng bạn mất quá nhiều hiệu quả khi sử dụng nó.

Edit:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/

+1

Làm thế nào để 'foreach' chậm? –

+0

Xem ở trên. Rất tiếc vì không cung cấp bằng chứng trong bài đăng gốc. – Polaris878

+0

Phương thức 'foreach' được liệt kê trong bài đăng đầu tiên * là * chậm ... để thao tác với các nhóm nội bộ hiện có của từ điển. –

5

Nếu bạn không sử dụng bools tri-nhà nước, sau đó bạn có thể sử dụng HashSet<string>, và gọi Clear() để thiết lập giá trị là "false".

+0

Đây là một lựa chọn tốt –

+0

Tôi không sử dụng tri-bang, nhưng tôi không hiểu làm thế nào để thực hiện những gì bạn đang nói về. Nó trông mát mẻ, mặc dù! –

+1

@Billy: Nếu chuỗi nằm trong 'HashSet', thì đó là sự thật. Nếu nó không nằm trong 'HashSet', nó sai. Sử dụng Thêm/Loại bỏ thay vì đặt đúng/sai. Điều này sẽ được * rất * nhanh, nhưng không có cách nào để đại diện cho một trạng thái "mất tích" thứ ba. –

2

Tôi đã phân biệt sự khác biệt giữa các giải pháp của Billy và Reed. Polaris878, lưu ý tốt về kết quả và nhớ rằng tối ưu hóa sớm là gốc rễ của tất cả các điều xấu ;-)

Tôi viết lại các giải pháp trong VB (vì tôi hiện đang lập trình bằng ngôn ngữ đó) và sử dụng phím int (để đơn giản), nếu không, đó là mã chính xác. Tôi chạy mã với một từ điển 10 triệu mục có giá trị "true" cho mỗi mục nhập. giải pháp gốc

Billy Witch Doctor của:

Dim keys = dict.Keys.ToList 
For i = 0 To keys.Count - 1 
    dict(keys(i)) = False 
Next 

mili giây trôi qua: 415

Reed Copsey của giải pháp:

For Each key In dict.Keys.ToList 
    dict(key) = False 
Next 

mili giây trôi qua: 395

Vì vậy, trong trường hợp đó, foreach thực sự là nhanh hơn.

18

Một giải pháp một dòng:

dict = dict.ToDictionary(p => p.Key, p => false); 
3

Tôi không chắc chắn nếu đó là cách tốt nhất nhưng tôi đang tìm kiếm một cái gì đó trên một dòng duy nhất và điều này làm việc cho tôi

mydict.Keys.ToList().ForEach(k => mydict[k] = false); 
Các vấn đề liên quan