我必须从某个位置开始搜索文本框中字符串数组中任何字符串的第一个匹配项。就像我有这个字符串数组:
string[] s = { "RTS", "RTL" };
这段代码:
LDA #$43
STA $1000,x
CMP $00
BEQ .main
.return
RTS
.main
add $01
RTL
它应该返回RTS,因为那是第一个匹配(不是RTL)。我怎样才能做到这一点?另外,有没有比使用数组更好的方法呢?
编辑,因为我给出了我想要做的一个坏例子。
答案 0 :(得分:0)
执行此操作的强力方法是依次在文本中搜索数组中的每个项目,将索引存储在每个项目的文本中,然后返回索引最小的项目。如果文本不大并且数组不大(与您的示例一样),那么这不会是一个问题。
如果你需要更高级的东西,那么我会考虑从数组中动态生成lexer,它将通过文本并给你答案。
答案 1 :(得分:0)
我想你想做这样的事情:
if (offset < 0xC0)
execute s[0]; //equals to put "return 0;" here
if (offset > 0xCF)
return 2;
if (offset == 0x20)
return 4;
return 1;
那是不可能的。我们可以在程序中编译一串c#代码并执行它,参见示例here。但动态代码不会影响生成它的当前代码。
答案 2 :(得分:0)
我建议使用正则表达式和简单的list<string>
答案 3 :(得分:0)
可能有算法可以有效地执行此操作,但我不知道。幸运的是,这可以通过基本搜索在代码中轻松表示。
var str = textbox.Text;
var words = new[] { "RTS", "RTL" };
var result = words.AsParallel()
.Select(Word => new { Word, Index = str.IndexOf(Word) })
.Where(p => p.Index >= 0)
.OrderBy(p => p.Index)
.Select(p => p.Word)
.FirstOrDefault();
if (result == null)
{
// no match
}
else
{
// match
}
这应该可以并行运行。如果没有,请删除AsParallel()
。
另一种方法是迭代字符串检查选择发生的第一个字。 它应该比第一个表现更好。
var result = Enumerable.Range(0, str.Length)
.SelectMany(i => words.Where(w => str.Substring(i)
.StartsWith(w)))
.FirstOrDefault();
如果你想要在效率方面做得最好,你必须为此编写状态机,但对于简单搜索2个(或更多)单词会非常复杂。