我有一个包含大量数字(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)
}
}
如何获得类似我想要的输出?
答案 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
这是输出:
答案 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)