C# 计数数组中的出现次数

C# 计数数组中的出现次数,c#,.net,dictionary,C#,.net,Dictionary,我正在计算数组中每个元素的出现次数,但是我得到了错误“Value cannot be null”。这对我来说没有意义,因为arr1完全填充了除最后5个元素为null之外的任何null值 这是我的密码。我是第一次使用字典,所以我可能有一些逻辑错误的地方。我在读一个文本文件 string[] arr1 = new string[200]; StreamReader sr = new StreamReader("newWorkSheet.txt"); string Templine1 = ""; in

我正在计算数组中每个元素的出现次数,但是我得到了错误“Value cannot be null”。这对我来说没有意义,因为arr1完全填充了除最后5个元素为null之外的任何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<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();
string[]arr1=新字符串[200];
StreamReader sr=新的StreamReader(“newWorkSheet.txt”);
字符串templane1=“”;
int计数器=0;
while(templane1!=null)
{
Templine1=sr.ReadLine();
arr1[计数器]=模板1;
计数器+=1;
}
高级关闭();
//字典中,键是列表中的数字,关联值是找到键的次数
字典出现次数=新字典();
//回路测试数据
foreach(arr1中的字符串值)
{
if(executions.ContainsKey(value))//检查我们以前是否找到过此键
{
//键存在。将此键的出现次数增加一次
出现次数[值]+;
}
其他的
{
//这是一个新密钥,请添加它。数字1表示此密钥已找到一次
事件。添加(值,1);
}
}
//转储结果
System.IO.StreamWriter sr2=新的System.IO.StreamWriter(“OrganizedVersion.txt”);
foreach(引用中的字符串键。键)
{
sr2.WriteLine(“整数”+键.ToString()+”被找到“+出现次数[key].ToString()+”次”);
}
sr2.Close();
Console.ReadLine();

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

我的钱在
arr1
上为空(基于这样一个事实,即您应该事先知道大小,但您正在用可能会更改的文件中的行填充)。好的是你实际上并不需要它

替换此:
foreach(arr1中的字符串值)

。。。为此:

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

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

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

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

foreach (string value in arr1)
{
     if (!string.IsNullOrEmpty(value))
     {
      ........
这将解决文件中可能存在的问题

“arr1已完全填充,没有空值”

没有。您放入数组中的最后一项为null。在将值放入数组之前,请检查该值:

while (true) {
  Templine1 = sr.ReadLine();
  if (Templine1 == null) break;
  arr1[counter++] = Templine1;
}
或者,如果您更喜欢这种方法:

while ((Templine1 = sr.ReadLine()) != null) {
  arr1[counter++] = Templine1;
}
现在,循环到索引
计数器
,而不是在整个数组中循环,不管您在其中放入了多少项:

for (int i = 0; i < counter; i++) {
  string value = arr1[i];
  ...
}
for(int i=0;i
是的,Linq就是答案。也许你也可以用ToDictionary()添加一个变体。@HenkHolterman,ToDictionary在这里不起作用,因为有多个项具有相同的键,ToLookup可以起作用。你可以使用这两个项来获取计数字典,比如
.ToLookup(…).ToDictionary(x=>x.key,x=>x.Count())
GroupBy
将取代
ToLookup
,无法立即确定此实例是否有差异。@TimS.,是的,但如果他只需要获得每个字符串的出现次数,则具体化可能是过火了。@TimS。GroupBy允许定义的执行,ToLookup创建一个具体化的collectionomg@奥斯汀沙龙你的解决方案奏效了!!!你弹的是哪种魔法棒?这对每个(出现的字符串键.Keys){Console.WriteLine(key.ToString()+“,“+出现的字符串[key].ToString());}起作用的原因是什么但是如果我执行sr2.WriteLine并尝试将输出写入一个文件,它只会将最后一行写入文本文件?@Harmond:你应该将其作为一个单独的问题提出。显示
arr1
counter
的声明和初始化@Harmond:你改变了使用数组的循环了吗?我用foreach File.ReadLines但现在我的输出文件都是空的…如果我使用Console.WriteLine,它会正确地显示所有内容,但如果我写入文件,它会在文件中显示为空…我的上一个foreach循环出现了问题。@Harmond:我需要查看代码,以便有机会知道它有什么问题。