2012-03-14 2 views
8

У меня есть очень простой List<string> установки, которая содержит множество отдельных символов в каждой позиции (т.е. foreach бы утешать к «а» «к» «р» и т.д.)Список <string> Простая группа и граф?

То, что я хотел бы сделать, это быть в состоянии сгруппировать элементы, а также подсчитать, сколько каждого происходит, так что я хотел бы получить результат, похожий:

a - 2 
t - 3 
y - 3 

Любые советы по лучший способ сделать это?

Я использую .Net 4, если это поможет.

ответ

32

(Учитывая, что каждая запись представляет собой один символ, есть какой-либо причине вы не имеете List<char>, кстати?)

Как насчет:

// 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() }); 

Обратите внимание, что это несколько неэффективна с точки зрения внутреннего представительства. Вы могли бы сделать это более эффективно «вручную», но это также потребует больше работы. Если ваш список не большой, я бы придерживался этого.

8

Самый простой способ сделать это является 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())); 
Смежные вопросы