计算列表中所有整数的出现次数

时间:2015-05-07 23:46:46

标签: c# data-structures

我有一个包含大量数字(500,000 +)的文本文件。

我想将所有唯一值添加到列表中,并计算它在整个数据集中出现的次数。

类似于:

23232: 55656565 times
35354: 45452 times
45454: 74747 times

我在C#中的代码可以将所有匹配项添加到列表中,但不能计算它们的频率:

private void CountUnique()
{
    List<Double> source = new List<double>();
    double sourceID = 0;

    StreamReader file = new StreamReader("trace.txt")
    while((line = file.ReadLine()) != null)
    {
        string[] words = line.split(' ');
        sourceID = double.Parse(words[1]);
        sourceList.Add(sourceID)
    }
}

如何获得类似我想要的输出?

3 个答案:

答案 0 :(得分:2)

将双打列表分组,然后使用组中的键和每个分组的计数将其放在字典中。

Dictionary<double,int> counts = source.GroupBy(d => d)
    .ToDictionary( g => g.Key, g => g.Count());

这是一个简单的种子:

var source = Enumerable.Range(0,500)
    .Select(i => ( i  % 6 ) + 0.02).ToList(); // just simple doubles list

这是输出:

enter image description here

答案 1 :(得分:0)

您可以尝试在字典中添加值,然后在数字重新出现在文件中时更新计数。如果它第一次出现,则可以将其添加到计数为1的字典中。

private void CountUnique()
{
 Dictionary<Double,int> source = new Dictionary<double,int>();
 double sourceID = 0;
StreamReader file = new StreamReader("trace.txt")
while((line = file.ReadLine()) != null)
 {
    string[] words = line.split(' ');
    sourceID = double.Parse(words[1]);
    if (sourcedictionary.ContainsKey(sourceID)
    {
         var sourcecount = source[sourceID];
         sourcecount++;
         source[sourceID] = sourcecount;
    }
    else{
            source.add (sourceID, 1);
     }

 }
}

答案 2 :(得分:0)

我有一个类似的问题作为面试测试问题。

这个问题要求优化执行此操作的例程,并计算平均值和中位数。

我使用SortedList代替词典。这样可以很容易地计算中位数并给出最小最大值。