计算列表中的数字

时间:2012-01-21 09:17:40

标签: c# algorithm

在C#中我有一个List,其中包含字符串格式的数字。这是计算所有这些数字的最佳方式?比如说我有三次数十......

我的意思是在unix中你可以说像

tempArray["5"] +=1

它类似于KeyValuePair,但它只是readonly。

任何快速而聪明的方式?

2 个答案:

答案 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();