(Как отмечено в ответе digEmAll, я уверен, если вы на самом деле не волнует, что они номера. - все, что здесь предполагается, что вы хотели, чтобы рассматривать их как строки)
простейший способ сделать это состоит в использовании LINQ:
var dictionary = values.GroupBy(x => x)
.ToDictionary(group => group.Key, group => group.Count());
Вы могли построить словарь самостоятельно, как это:
var map = new Dictionary<string, int>();
foreach (string number in list)
{
int count;
// You'd normally want to check the return value, but in this case you
// don't care.
map.TryGetValue(number, out count);
map[number] = count + 1;
}
... но я предпочитаю лаконичность подхода LINQ :) Это будет немного менее эффективно, заметьте - если это проблема, я лично, вероятно, создаю общий метод расширения «подсчета»:
public static Dictionary<T, int> GroupCount<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
var map = new Dictionary<T, int>();
foreach (T value in source)
{
int count;
map.TryGetValue(number, out count);
map[number] = count + 1;
}
return map;
}
(вы могли бы хотеть другую перегрузку, принимающую IEqualityComparer<T>
.) Написав этот раз, вы можете использовать его в любое время вам нужно, чтобы получить отсчеты для элементов:
var counts = list.GroupCount();