如何更改此数组中的值? C#

时间:2018-07-17 09:51:49

标签: c# arrays winforms speech-recognition

所以我想做一些语音识别(使用system.speech.recognition)软件,并带有一些可以更改的命令列表。因此,例如,起初您有两种命令列表:“ Left,Right”,当您说左或右时它将执行某些功能。但是我想在此软件中可以随时更改命令列表,例如,在上面的命令列表中,我想将单词“ Left”更改为“ Up”,当我说“ Up”时,它将执行在执行“左”字之前的功能。这是我的代码:

[Flags]
public enum ModuleAttributes {
    ILOnly = 1,
    Required32Bit = 2,
    StrongNameSigned = 8,
    Preferred32Bit = 0x00020000,
}

我想更改“ command.Add(新字符串[] {Atext.Text,Dtext.Text)”内部的值

我将命令列表放入文本框中,因此当我运行软件时,当我想更改命令列表时,我只需要更改文本框内的单词,当我单击“保存”按钮时,命令列表就会改变。问题是当我单击“保存”按钮时,命令列表不会更改。

是否可以更改Choices对象和GrammarBuilder对象的值?

1 个答案:

答案 0 :(得分:1)

填充数组后,您不应修改该数组(可能是列表)。 我假设gBuilder包含语音识别接受的所有命令。如果是这样,请添加所有将要使用的命令,并在RecEngine_SpeechRecognized事件中检查它们是否已启用,然后才实际触发基于它们的操作。

为您提供一个基本示例:

public void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    //mode could be a string or an enum variable
    if(mode.Equals("LEFT_RIGHT") && e.Result.Text == Atext.Text)
    {
      PressKey(0x1E);
     }
    else if (mode.Equals("LEFT_RIGHT") && e.Result.Text == Dtext.Text)
    {
        PressKey(0x20);
    }else if (mode.Equals("UP_DOWN") && e.Result.Text == Stext.Text)
    {
        PressKey(...);
    }else if(mode.Equals("UP_DOWN") && e.Result.Text == Wtext.Text)
    {
        PressKey(....);
    }
}

如果您的程序将变得更加复杂,则更好的方法是创建已启用命令的列表。检查该实现的示例:

public void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    //enabledCommands is a list of strings (or whatever can store Atext.Text and the others)
    if(enabledCommands.Contains(e.Result.Text){ //First check if whatever command you received is enabled
      if(e.Result.Text == Atext.Text) //then check what command it is and execute it
      {
         PressKey(0x1E);
      }
    }
}

如果您的程序要求您可以走得更远并实现一个对象列表,则每个对象都包含一个命令和一个布尔值,指示是否启用了该命令,但这要比它需要的代码多得多,而且可能更复杂是。