0

我正在使用一些用于制作 Code Editor 的替换代码。

就像这样的场景,当我在RichTextbox(用作代码编辑器)示例中输入关键字时:我输入"Ac"RichTextboxrtb)然后假设ComboBox(声明为 lb)会出现。

就像里面有字符串的上下文提示/智能感知:

public string[] Accep = { "AcceptRejectRule" };
public string[] Acces = { "AccessibleEvents" };

然后我使用KeyEventargs 代码如果我在最后一个单词中选择后按 EnterComboBox 将替换为我之前键入的单词,就像当我键入 所有以in"Ac"开头的字符串时一样:"Ac"ComboBox

--- 这适用于在richtextbox 中输入的每个单词

if (token == "letterA" || token.StartsWith("Ac") || token.StartsWith("ac") || token.StartsWith("AC"))
{
    int length = line.Length - (index - start);
    string commentText = rtb.Text.Substring(index, length);
    rtb.SelectionStart = index;
    rtb.SelectionLength = length;
    lb.Visible = true;

    KeyWord keywordsHint = new KeyWord();

    foreach (string str in keywordsHint.ac)
    {
        lb.Items.Add(str);
        lb.SelectedIndex = lb.FindStringExact(str);
    }                   
}

--- 这是一个KeyEvent参数

if (e.KeyCode == Keys.Enter)
{    
    string Slb = lb.SelectedText.ToString();
    var trimmed = RemoveFromStart(Slb, new String[] { "Ac", "Accep", "Acces" });
    rtb.SelectedText = trimmed;

    lb.Hide();
}

然后,当我在ComboBox示例中选择时"Ac",我想在ComboBox( "AcceptRejectRule", "AccessibleEvents") 中选择 AccessibleEvent,当我按 Enter 时,输出将是"AccessibleEvents"因为它被声明为"Ac“将在替换代码上方和此参数内部时删除:

//Replacing Parameter:
public string RemoveFromStart(string s, IEnumerable<string> strings)
{
    foreach (var x in strings.Where(s.StartsWith))
    {
        return s.Remove(0, x.Length);
    }
    return s;
}

但是当我键入时,"Acces"我选择"AccessibleEvents"输出将是: "AccescessibleEvents"而不是“AccessibleEvent”,因为“Ac”是我在RemoveFromStart方法中使用的最短字符串。

现在我的问题是如何在代码中创建每个字符串:

var trimmed = RemoveFromStart(Slb, new String[] { "Ac", "Accep", "Acces" });

唯一的我可以让"Accep"即使“也删除"Ac”被声明为最短的字符串。

非常感谢您,希望您能帮助我:(。真的非常需要帮助。

4

1 回答 1

0

我认为简单的降序排序将首先匹配最长的字符串:

 var trimmed = RemoveFromStart(Slb, 
     (new String[] { "Ac", "Accep", "Acces" })
      .OrderByDescending(s=>s));

旁注:在您的代码中考虑不区分大小写的比较。

于 2013-04-04T06:00:05.887 回答