2015-05-07 2 views
2

У меня есть текстовый файл с большим количеством чисел (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) 
    } 
} 

Как получить выход как тот, который я хочу?

+4

Вместо этого вы можете использовать словарь «», ключ - это число, а значение - это счетчик. Если он существует в словаре, увеличьте количество, иначе добавьте его со значением 1. –

+0

Полностью забыли об этом. Отличная идея! Благодаря! – ForeverLearning

ответ

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

+0

не нужна эта дополнительная проекция - вы можете сделать это как часть 'ToDictionary' – BrokenGlass

+0

@BrokenGlass - вы правы :) Отредактировано. –

+0

@BrokenGlass - проекция - хорошая идея. Без него вся запись базы данных переносится через провод перед выполнением '.ToDictionary'. С проекцией только требуемые поля. – Enigmativity

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

} 
} 
0

У меня был аналогичный вопрос, связанный с вопросом для интервью.

Этот вопрос попросил оптимизировать рутину, которая делает это, и вычисляет среднюю и среднюю.

Вместо словаря я использовал SortedList. Это упростило вычисление медианы и дало минимальные значения.

Смежные вопросы