2012-03-14 35 views
8

Tôi có một thiết lập rất đơn giản List<string> trong đó có rất nhiều nhân vật duy nhất cho mỗi mục (IE một foreach sẽ an ủi ra "a" "k" "p" vv)Danh sách <string> Nhóm và số đếm đơn giản?

Những gì tôi muốn làm là có thể để nhóm các mục và cũng tính số lượng mỗi mục xuất hiện để tôi nhận được kết quả tương tự như:

a - 2 
t - 3 
y - 3 

Mọi mẹo về cách tốt nhất để làm điều này?

Tôi đang sử dụng .Net 4 nếu đó là bất kỳ trợ giúp nào.

Trả lời

32

(Cho rằng mỗi mục là một nhân vật duy nhất, là có bất cứ lý do bạn không có một List<char> bằng cách này?)

Làm thế nào về:

// To get a Dictionary<string, int> 
var counts = list.GroupBy(x => x) 
       .ToDictionary(g => g.Key, g => g.Count()); 

// To just get a sequence 
var counts = list.GroupBy(x => x) 
       .Select(g => new { Text = g.Key, Count = g.Count() }); 

Lưu ý rằng điều này là hơi kém hiệu quả về đại diện nội bộ. Bạn chắc chắn có thể làm điều đó hiệu quả hơn "thủ công", nhưng nó cũng sẽ mất nhiều công sức hơn. Trừ khi danh sách của bạn là lớn, tôi sẽ dính vào điều này.

8

Cách đơn giản nhất để làm điều này là sử dụng LINQ

var list = new[] { "a", "a", "b", "c", "d", "b" }; 
var grouped = list 
    .GroupBy(s => s) 
    .Select(g => new { Symbol = g.Key, Count = g.Count() }); 

foreach (var item in grouped) 
{ 
    var symbol = item.Symbol; 
    var count = item.Count; 
} 
2
var list = new[] {"a", "t", "t", "y", "a", "y", "y", "t"}; 
var result = (from item in list 
       group item by item into itemGroup 
       select String.Format("{0} - {1}", itemGroup.Key, itemGroup.Count())); 
Các vấn đề liên quan