Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从文件读取时出现无限循环问题_C#_List_Streamreader - Fatal编程技术网

C# 从文件读取时出现无限循环问题

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

我正在用C#编写一个程序,从文件中读取所有唯一的单词,并将每个单词在文件中出现的次数输出到csv文件。我的问题是,当我试图运行我的程序时,我永远都无法摆脱逐行运行的while循环

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我猜事实上您的代码没有跳出“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。我会给你