代码之家  ›  专栏  ›  技术社区  ›  dnclem

C查找字符串数组中字符串的第一个匹配项

c#
  •  0
  • dnclem  · 技术社区  · 14 年前

    我必须在文本框中从某个位置开始搜索字符串数组中任何字符串的第一个匹配项。如果我有这个字符串数组:

    string[] s = { "RTS", "RTL" };
    

    这个代码:

    LDA #$43
    STA $1000,x
    CMP $00
    BEQ .main
    .return
    RTS
    .main
    add $01
    RTL
    

    它应该返回RTS,因为这是第一个匹配项(而不是RTL)。我该怎么做?此外,是否有更好的方法来实现这一点而不是使用数组?

    编辑,因为我给出了一个坏的例子,我想做什么。

    4 回复  |  直到 13 年前
        1
  •  0
  •   Jeff Mercado    14 年前

    也许有一些算法可以有效地做到这一点,但我不知道有什么。幸运的是,这可以通过基本搜索在代码中很容易地表示出来。

    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个(或更多)单词搜索来说,这是非常复杂的。

        2
  •  0
  •   Lee    14 年前

    执行此操作的强制方法是依次搜索数组中每个项目的文本,将索引存储在每个项目的文本中,然后返回索引最小的项目。如果文本不大,数组也不大(如您的示例所示),那么这就不是问题。

    如果你需要更高级的东西,那么我会考虑生成一个 lexer 从数组中快速返回文本并给出您的答案。

        3
  •  0
  •   Cheng Chen    14 年前

    我想你想做这样的事:

        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 . 但是动态代码不会影响生成它的当前代码。

        4
  •  0
  •   Prasanna K Rao    14 年前

    我建议使用正则表达式和简单的 list<string>