2013-05-13 3 views
0

Я подсчитываю появление каждого элемента в массиве, но получаю ошибку «Значение не может быть null». Это не имеет для меня смысла, потому что arr1 полностью заполнен без нулевых значений, за исключением последних 5 элементы, которые являются нулевыми.Подсчет событий в массиве

Вот мой код. Я использую словарь впервые, поэтому у меня может быть некоторая логическая ошибка. Я читаю из текстового файла.

string[] arr1 = new string[200]; 
StreamReader sr = new StreamReader("newWorkSheet.txt"); 
string Templine1 = ""; 
int counter = 0; 
while (Templine1 != null) 
{ 
    Templine1 = sr.ReadLine(); 
    arr1[counter] = Templine1; 
    counter += 1; 
} 
sr.Close(); 

// Dictionary, key is number from the list and the associated value is the number of times the key is found 
Dictionary<string, int> occurrences = new Dictionary<string, int>(); 
// Loop test data 
foreach (string value in arr1) 
{ 
    if (occurrences.ContainsKey(value)) // Check if we have found this key before 
    { 
     // Key exists. Add number of occurrences for this key by one 
     occurrences[value]++; 
    } 
    else 
    { 
     // This is a new key so add it. Number 1 indicates that this key has been found one time 
     occurrences.Add(value, 1); 
    } 
} 

// Dump result 
System.IO.StreamWriter sr2 = new System.IO.StreamWriter("OrganizedVersion.txt"); 
foreach (string key in occurrences.Keys) 
{ 
    sr2.WriteLine("Integer " + key.ToString() + " was found " + occurrences[key].ToString() + " times"); 
} 
sr2.Close(); 
Console.ReadLine(); 

Редактировать: Я разместил здесь весь код, включая объявление.

+0

Показать объявление и инициализацию 'arr1' и' counter'. –

ответ

1

Мои деньги находятся на arr1, являющихся нулевыми (исходя из того, что вы должны знать размер заранее, но вы заполняете строки из файла, которые могут быть изменены). Хорошо, что вам это действительно не нужно.

Заменить это: foreach (string value in arr1)

... с этим:

foreach(string value in File.ReadLines("fileName")) 
{ 
} 

MSDN File.ReadLines

+0

omg! @Austin Salonen ваше решение сработало !!! Какую волшебную палочку вы пролили? – Harmond

+0

@Harmond: Это просто опыт ... –

+0

Какова причина это работает Еогеаспа (строка ключ в occurrences.Keys) { Console.WriteLine (key.ToString() + "" + вхождения [ключ] .Нанизывать()); } но если я делаю sr2.WriteLine и пытаюсь записать вывод в файл, он записывает только последнюю строку в текстовый файл? – Harmond

4

Это не совсем ваш вопрос, но Linq может уменьшить количество строк здесь:

var groups = arr1.GroupBy(item => item); 
foreach (var group in groups) 
{ 
    Console.WriteLine(string.Format("{0} occurences of {1}", group.Count(), group.Key); 
} 
+0

Да Linq - это ответ. Возможно, вы также можете добавить вариант с ToDictionary(). –

+1

@HenkHolterman, ToDictionary не работает здесь, поскольку есть несколько элементов с одним и тем же ключом, ToLookup будет работать –

+1

Вы можете использовать оба метода, чтобы получить словарь счетчиков, например '.ToLookup (...). ToDictionary (x = > x.Key, x => x.Count()) '. 'GroupBy' будет работать вместо« ToLookup », не уверен сразу, если в этом случае есть разница. –

0

В вашей петле вам нужно проверить, есть ли null в своем значении

foreach (string value in arr1) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     ........ 

Это будет заботиться о проблемах, которые могут иметь в файле.

1

"arr1 полностью заполняется без нулевых значений"

Nope. Последний элемент, который вы помещаете в массив, равен null. Проверьте значение, прежде чем поместить его в массив:

while (true) { 
    Templine1 = sr.ReadLine(); 
    if (Templine1 == null) break; 
    arr1[counter++] = Templine1; 
} 

Или, если Вам нравится этот метод лучше:

while ((Templine1 = sr.ReadLine()) != null) { 
    arr1[counter++] = Templine1; 
} 

Теперь петля до индекса counter, вместо цикла через весь массив независимо от количества предметов, которые вы положили в него:

for (int i = 0; i < counter; i++) { 
    string value = arr1[i]; 
    ... 
} 
+0

Вы правы, что последний элемент имеет значение null. – Harmond

+0

Но даже после того, как я удалю последний null, я получаю эту ошибку. – Harmond

+0

@Harmond: Вы изменили цикл, в котором вы используете массив? – Guffa

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