计算Array中的出现次数

我正在计算数组中每个元素的出现但我得到错误“值不能为空”这对我没有意义,因为arr1完全填充没有空值,除了最后5个为null的元素。

这是我的代码。 我是第一次使用字典,所以我可能在某处出现一些逻辑错误。 我正在阅读文本文件。

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 occurrences = new Dictionary(); // 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(); 

编辑:我把所有代码都放在这里,包括声明。

这不完全是你的问题,但Linq可以减少这里的行数:

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

我的钱是在arr1为空(基于你事先应该知道大小,但你正在填写可能会改变的文件中的行)。 好的是你实际上并不需要它。

替换此: foreach (string value in arr1)

… 有了这个:

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

MSDN File.ReadLines

“arr1完全填充没有空值”

不。 放在数组中的最后一项是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]; ... } 

在循环中,您需要检查null中是否为null

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

这将解决您在文件中可能遇到的问题。