C# 从文件读取时出现无限循环问题
我正在用C#编写一个程序,从文件中读取所有唯一的单词,并将每个单词在文件中出现的次数输出到csv文件。我的问题是,当我试图运行我的程序时,我永远都无法摆脱逐行运行的while循环C# 从文件读取时出现无限循环问题,c#,list,streamreader,C#,List,Streamreader,我正在用C#编写一个程序,从文件中读取所有唯一的单词,并将每个单词在文件中出现的次数输出到csv文件。我的问题是,当我试图运行我的程序时,我永远都无法摆脱逐行运行的while循环 public override List<WordEntry> GetWordCount() { List<WordEntry> words = new List<WordEntry>(); WordEntry wordEntry = new Word
public override List<WordEntry> GetWordCount()
{
List<WordEntry> words = new List<WordEntry>();
WordEntry wordEntry = new WordEntry();
//string[] tokens = null;
string line, temp, getword;
int count = 0, index = 0;
long number;
while ((line = input.ReadLine()) != null)
{
if (line == null)
Debug.Write("shouldnt happen");
char[] delimit = { ' ', ',' };
string[] tokens = line.Split(delimit);
if (words.Count == 0)
{
wordEntry.Word = tokens[0];
wordEntry.WordCount = 1;
words.Add(wordEntry);
}//end if
for (int i = 0; i < tokens.Length; i++)
{
for (int j = 0; j < words.Count; j++)
{
if (tokens[i] == words[j].Word)
{
number = words[j].WordCount;
number++;
getword = words[j].Word;
wordEntry.WordCount = number;
wordEntry.Word = getword;
words.RemoveAt(j);
words.Insert(j, wordEntry);
}//end if
else
{
wordEntry.Word = tokens[i];
wordEntry.WordCount = 1;
words.Add(wordEntry);
}//end else
}//end for
}//end for
}//end while
return words;
}
public覆盖列表GetWordCount()
{
列表单词=新列表();
WordEntry=newwordentry();
//字符串[]标记=null;
字符串行、temp、getword;
整数计数=0,索引=0;
长数;
而((line=input.ReadLine())!=null)
{
如果(行==null)
Debug.Write(“不应该发生”);
char[]定界={'',','};
string[]tokens=line.Split(定界);
如果(words.Count==0)
{
wordEntry.Word=tokens[0];
wordEntry.WordCount=1;
添加(wordEntry);
}//如果结束
for(int i=0;i
它被卡在while循环中,好像它永远不会到达文件的末尾。该文件的大小为2.6MB,因此应该能够保存到最后 我猜事实上,您的代码没有跳出“for(int j=0;j
var words = new Dictionary<string,int>();
while ((line = input.ReadLine()) != null)
{
if (line == null)
Debug.Write("shouldnt happen");
char[] delimit = { ' ', ',' };
string[] tokens = line.Split(delimit);
foreach (var word in tokens)
{
if(words.ContainsKey(word))
words[word]++;
else
words.Add(word, 1);
}
}
下面是如何重写代码以使用字典
var words = new Dictionary<string,int>();
while ((line = input.ReadLine()) != null)
{
if (line == null)
Debug.Write("shouldnt happen");
char[] delimit = { ' ', ',' };
string[] tokens = line.Split(delimit);
foreach (var word in tokens)
{
if(words.ContainsKey(word))
words[word]++;
else
words.Add(word, 1);
}
}
你等了多久?这是一个非常大的文件…为什么不使用
字典来快速检查你是否已经看到了这个单词,而不是循环检查你已经看到的所有单词。我不认为你想在每个for
循环中使用相同的单词条目
实例。因为它是一种引用类型,所以您总是在修改您在上一个循环中添加的单词条目(这也是您在上一个循环中添加的条目,等等)。我选择这并不是因为性能太差而结束,而是因为每个单词都与上一个单词列表相比较,所以您会得到平方复杂度。相反,使用字典可以使扫描线性化。这个问题中的代码就是一个很好的例子,为什么一个函数只能做一件事。这里的函数尝试做两件事:读取行并处理它们。因此,问题的作者认为,他的readline()相关代码失败了(调试器似乎坏了…),而导致问题的是处理代码。如果在子例程中进行处理,则在没有处理的情况下,您只需注释一行代码就可以很容易地看到读取while循环所需的时间。您等待了多长时间?这是一个非常大的文件…为什么不使用字典来快速检查你是否已经看到了这个单词,而不是循环检查你已经看到的所有单词。我不认为你想在每个for
循环中使用相同的单词条目
实例。因为它是一种引用类型,所以您总是在修改您在上一个循环中添加的单词条目(这也是您在上一个循环中添加的条目,等等)。我选择这并不是因为性能太差而结束,而是因为每个单词都与上一个单词列表相比较,所以您会得到平方复杂度。相反,使用字典可以使扫描线性化。这个问题中的代码就是一个很好的例子,为什么一个函数只能做一件事。这里的函数尝试做两件事:读取行并处理它们。因此,问题的作者认为,他的readline()相关代码失败了(调试器似乎坏了…),而导致问题的是处理代码。如果在子例程中进行处理,如果没有处理,您只需注释一行代码就可以很容易地看到读取while循环所需的时间。看起来不错。我想你可以跳过对words.ContainsKey的调用,直接使用te indexer到always++@juharr,我会研究这个。我感谢你的帮助。我看这个的唯一问题是,这是一个预先编写的方法,我需要为它编写代码。它必须返回一个列表。如果不将字典分成两个不同的列表,这是可能的吗?返回words.Keys.ToList()@bizzes Beautiful。我会试一试,然后再打给你。@bickets你必须记住,I++
和I=I+1
是一样的,所以当你做words[word]++
的时候,你会先叫能手,然后叫二传手。看起来不错。我想你可以跳过对words.ContainsKey的调用,直接使用te indexer到always++@juharr,我会研究这个。我感谢你的帮助。我看这个的唯一问题是,这是一个预先编写的方法,我需要为它编写代码。它必须返回一个列表。如果不将字典分成两个不同的列表,这是可能的吗?返回words.Keys.ToList()@bizzes Beautiful。我会给你