计算列表中的数字
本文关键字:数字 列表 计算 | 更新日期: 2023-09-27 18:21:04
在C#中,我有一个列表,其中包含字符串格式的数字。计算这些数字的最好方法是哪一种?例如说我有三次数字十。。
我的意思是,在unix awk中,你可以说之类的话
tempArray["5"] +=1
它类似于KeyValuePair,但它是只读的。
有什么快速而聪明的方法吗?
使用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());
(正如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();