在C#中我有一个List,其中包含字符串格式的数字。这是计算所有这些数字的最佳方式?比如说我有三次数十......
我的意思是在unix中你可以说像
tempArray["5"] +=1
它类似于KeyValuePair,但它只是readonly。
任何快速而聪明的方式?
答案 0 :(得分:6)
使用LINQ非常简单:
var occurrenciesByNumber = list.GroupBy(x => x)
.ToDictionary(x => x.Key, x.Count());
当然,将您的数字表示为字符串,此代码确实区分了"001"
和"1"
,即使在概念上是相同的数字。
要计算具有相同值的数字,您可以执行以下操作:
var occurrenciesByNumber = list.GroupBy(x => int.Parse(x))
.ToDictionary(x => x.Key, x.Count());
答案 1 :(得分:2)
(正如在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();