Список <string>Простая группа и количество? - PullRequest
11 голосов
/ 14 марта 2012

У меня очень простая настройка List<string>, которая содержит множество одиночных символов на элемент (IE a foreach будет выводить на консоль "a", "k", "p" и т. Д.)Мне бы хотелось иметь возможность группировать предметы, а также подсчитывать, сколько из них встречается, поэтому я получаю вывод, подобный следующему:

a - 2
t - 3
y - 3

Какие-нибудь советы о том, как это сделать лучше?*

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

Ответы [ 3 ]

40 голосов
/ 14 марта 2012

(Учитывая, что каждая запись является отдельным символом, есть ли причина, по которой у вас, кстати, нет 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 голосов
/ 14 марта 2012

Самый простой способ сделать это - использовать 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 голосов
/ 14 марта 2012
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()));
...