2009-03-26 32 views
7

Tôi có một Danh sách chứa một chuỗi các chuỗi có thể xuất hiện nhiều lần. Tôi muốn lấy danh sách này và xây dựng một từ điển của các mục danh sách dưới dạng khóa và số lần xuất hiện của chúng như là giá trị.Xây dựng một từ điển đếm các mục trong danh sách

Ví dụ:

List<string> stuff = new List<string>(); 
stuff.Add("Peanut Butter"); 
stuff.Add("Jam"); 
stuff.Add("Food"); 
stuff.Add("Snacks"); 
stuff.Add("Philosophy"); 
stuff.Add("Peanut Butter"); 
stuff.Add("Jam"); 
stuff.Add("Food"); 

và kết quả sẽ là một từ điển bao gồm:

"Peanut Butter", 2 
"Jam", 2 
"Food", 2 
"Snacks", 1 
"Philosophy", 1 

Tôi có một cách để làm điều này, nhưng nó không có vẻ như tôi đang sử dụng tốt thứ trong C# 3,0

public Dictionary<string, int> CountStuff(IList<string> stuffList) 
{ 
    Dictionary<string, int> stuffCount = new Dictionary<string, int>(); 

    foreach (string stuff in stuffList) { 
     //initialize or increment the count for this item 
     if (stuffCount.ContainsKey(stuff)) { 
      stuffCount[stuff]++; 
     } else { 
      stuffCount.Add(stuff, 1); 
     } 
    } 

    return stuffCount; 
} 

Trả lời

20

Bạn có thể sử dụng mệnh đề nhóm trong C# để thực hiện việc này.

List<string> stuff = new List<string>(); 
... 

var groups = from s in stuff group s by s into g select 
    new { Stuff = g.Key, Count = g.Count() }; 

Bạn có thể gọi các phương pháp khuyến nông trực tiếp cũng như nếu bạn muốn:

var groups = stuff.GroupBy(s => s).Select(
    s => new { Stuff = s.Key, Count = s.Count() }); 

Từ đây đó là một bước ngắn để đặt nó vào một Dictionary<string, int>:

var dictionary = groups.ToDictionary(g => g.Stuff, g => g.Count); 
+0

Làm thế nào bạn sẽ thêm một orderby với ví dụ đầu tiên? – zadam

+0

@zadam Bạn luôn có thể nói 'groups = groups.OrderBy (g => g.Stuff)'; – casperOne

1

một ý tưởng sẽ được cung cấp cho các từ điển một default value của số không, vì vậy bạn wou ldn't phải đặc biệt trường hợp sự xuất hiện đầu tiên.

+0

Vâng, đó sẽ chỉ được di chuyển mã để xử lý các trường hợp đặc biệt vào một lớp học riêng biệt ... – Guffa

0

Vâng, có không thực sự là cách tốt nhất để làm điều đó.

Có lẽ bạn có thể viết truy vấn LINQ sẽ nhóm các chuỗi và sau đó đếm số chuỗi có trong mỗi nhóm, nhưng điều đó sẽ không gần như hiệu quả như những gì bạn đã có.

7

Tôi đã tạo danh sách chuyên ngành, được hỗ trợ bởi từ điển và phương thức thêm sẽ kiểm tra thành viên và tăng số lượng nếu được tìm thấy.

sorta thích:

public class CountingList 
{ 
    Dictionary<string, int> countingList = new Dictionary<string, int>(); 

    void Add(string s) 
    { 
     if(countingList.ContainsKey(s)) 
      countingList[ s ] ++; 
     else 
      countingList.Add(s, 1); 
    } 
} 
Các vấn đề liên quan