【问题标题】:Error getting list from class从类中获取列表时出错
【发布时间】:2015-11-10 20:54:48
【问题描述】:

我已经创建了这个类:

class Riconoscimento
{
    private List<Word> words = new List<Word>();


    public List<Word> GetList()
    {
        return words;
    }

    public void loadWords()
    {
        string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "/../../words.txt");
            foreach (string line in lines)
            {
                // skip commentblocks and empty lines..
                if (line.StartsWith("--") || line == String.Empty) continue;

                // split the line
                var parts = line.Split(new char[] { '|' });

                // add commandItem to the list for later lookup or execution
                words.Add(new Word() { Text = parts[0], AttachedText = parts[1], IsShellCommand = (parts[2]) });


            }
      }
}

但是在加载 loadWords() 之后,当我尝试从我的 MainForm 中的类中获取单词时

 public void engine_WordsRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        Riconoscimento _riconoscimento = new Riconoscimento();
        List<Word> words = _riconoscimento.GetList();
        var cmd = words.Where(c => c.Text == e.Result.Text).First();
}

出现此错误: System.InvalidOperationException - 序列不包含元素。

就像它无法从课堂上检索单词一样,我不明白为什么。 如果我不使用该类,但将所有内容都放在我的主代码中,它就可以工作。 我该怎么办?

问题已解决:我将 loadWords() 加载到我的另一个 void 中,我必须将它加载到我的另一个 void 中。

【问题讨论】:

  • 列表为空。在loadWords() 中设置断点并确保您的文字正在加载。
  • 我知道它是空的,但我不知道为什么。如果我在我的 mainForm 而不是类中使用这个 loadWords,同时还在我的主窗体中创建 List 它可以工作。
  • 在您的 engine_WordsRecognized 中,您正在创建一个新的(本地)Riconoscimento 实例并调用 GetList(),而不对其调用 loadWords:它的内部单词列表仍然是空的

标签: c# list class ienumerable


【解决方案1】:

你没有打电话给loadWords()。这就是为什么没有加载任何内容。

public void engine_WordsRecognized(object sender, SpeechRecognizedEventArgs e)
{
    Riconoscimento _riconoscimento = new Riconoscimento();
    _riconoscimento.loadWords();
    List<Word> words = _riconoscimento.GetList();
    var cmd = words.Where(c => c.Text == e.Result.Text).First();
}

【讨论】:

  • 他说“加载后loadWords()”
  • 我在 mainForms 内部的另一个空白中调用它。我要在这个里面再调用一次吗?
  • 您应该调用新创建的实例。
【解决方案2】:

该错误来自对First 的调用。在创建 Riconoscimento 之后,您没有调用 loadWords,因此该列表永远不会被填充。如果您在某个地方有另一个实例已经加载了数据,那么您也许可以使用它,或者您也可以将words 设为静态,前提是 每个 实例都相同。 p>

此外,如果列表可能不包含您要查找的值,则 FirstOrDefault 将返回 null 而不是抛出异常。

【讨论】:

    【解决方案3】:

    你不要打电话给loadWords。你只是从这个属性中得到一个空列表。

    public List<Word> GetList()
    {
        return words;
    }
    

    您必须在获取属性之前调用 loadWords。

    _riconoscimento.loadWords();
    

    或者从属性内部调用它。

    private List<Word> words = null; // initialize new list list inside loadWords
    
    public List<Word> GetList()
    {
        if(words == null) loadWords();
        return words;
    }
    

    【讨论】:

    • 有很多方法可以做到这一点。另一种方法是在构造函数中进行此调用。我不知道应该多久(何时)调用此方法。但是当 OP 遇到问题时,他可以为自己选择最好的方法。 @史蒂夫
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2021-07-02
    • 1970-01-01
    • 2020-12-29
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多