计算列表中的数字

本文关键字:数字 列表 计算 | 更新日期: 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();