2012-01-21 27 views
3

在C#中,我有一个列表,其中包含字符串格式的数字。计算所有这些数字的最佳方法是什么?例如说我有三个时间我的意思是在UNIX中排名第十..在列表中计数数字

awk的,你可以这样说

tempArray["5"] +=1 

它类似于一个KeyValuePair,但它是只读的。

任何快速和智能的方式?

回答

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