2012-03-29 6 views
7

Tôi có một danh sách mà tôi muốn đưa vào một từ điển, để đơn giản các giá trị được chèn vào sẽ giống nhau.C# ToDictionary với ContainsKey kiểm tra

Tôi có thể sử dụng vòng lặp foreach.

List<string> list = new List<string>(); 
    list.Add("Earth"); 
    list.Add("Wind"); 
    list.Add("Fire"); 
    list.Add("Water"); 
    list.Add("Water"); // Will NOT BE INSERTED using the foreach loop 

    var myDictionary= new Dictionary<string, int>(); 
    foreach (string value in list) 
    { 
     if (!myDictionary.ContainsKey(value)) 
     { 
     myDictionary.Add(value, 1); 
     } 
    } 

Các công trình trên.

Nhưng tôi muốn sử dụng ToDictionary làm tương tự theo cách sau -

Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1); 

Tất nhiên điều này không thành công vì tôi thêm "nước" hai lần.

Cách kiểm tra chính xác mục trùng lặp khi sử dụng ToDictionary là gì?

Trả lời

14

Bạn có thể sử dụng Distinct() để lọc ra các bản sao:

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1); 

Các phương pháp tương tự sẽ làm cho vòng lặp truyền thống của bạn rõ ràng hơn nhiều quá, vì bạn không cần phải kiểm tra "bằng tay" các bản sao:

foreach (string value in list.Distinct()) 
{ 
    myDictionary.Add(value, 1); 
} 
+6

Điều này sẽ hiệu quả, nhưng tôi tự hỏi liệu OP có thực sự muốn một bộ không. – Gabe

+0

@Gabe: Không chắc tôi không hiểu nhận xét của bạn trong bối cảnh câu hỏi - bạn có thể làm rõ không? – BrokenGlass

+1

Một từ điển mà tất cả các giá trị là 1 về cơ bản chỉ là một tập hợp. Nếu người dùng không bao giờ accesse các giá trị, một từ điển thực tế là không cần thiết. – Gabe

7

Distinct là một tùy chọn tránh vấn đề về khóa trùng lặp. Nếu bạn cần một số bản sao, bạn có thể thử một cái gì đó như thế này GroupBy như sau:

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count()); 

Nếu ứng dụng của bạn không chỉ là một cấu trúc đơn giản chuỗi-list/lặp lại đếm, bạn có thể nhận được một số mileage từ lựa chọn một cấu trúc khác như số Lookup mà bạn có thể nhận được từ việc gọi đến tiện ích mở rộng ToLookup -hoặc có thể thực hiện với một Nhóm như GroupBy Tôi đã sử dụng ở trên.