1

与此问题相关:Using Linq to filter out certain Keys from a Dictionary and return a new dictionary

我有一个使用字典的自动完成控件。场景是我的 RichTextBox(用作代码编辑器)中的每个单词都会自动添加到我的自动完成列表中。就像我在 RichTextBox 中键入单词“asdasdasd”一样,单词“asdasdasd”将自动添加到我的 auto-complete 中。

使用此代码:

private IEnumerable<AutocompleteItem> BuildList()
{
    //find all words of the text
    var words = new Dictionary<string, string>();

    var keysToBeFiltered = new HashSet<string> { "Do", "Not" };
    var filter = words.Where(p => !keysToBeFiltered.Contains(p.Key))
                      .ToDictionary(p => p.Key, p => p.Value);

    foreach (Match m in Regex.Matches(rtb_JS.Text, @"\b\w+\b"))
        filter[m.Value] = m.Value;

    //foreach (Match m in Regex.Matches(rtb_JS.Text, @"^(\w+)([=<>!:]+)(\w+)$"))
        //filter[m.Value] = m.Value;

    foreach (var word in filter.Keys)
    {
        yield return new AutocompleteItem(word);
    }
}

现在仍然包含“Do”和“Not”两个词以使用上面的代码自动完成。此外,当我的表单加载时,会出现一个特定的默认脚本,该脚本必须一直存在。所以我不能改变它。

我必须采取两种可能的解决方案来解决这个问题:1. 不允许在默认脚本中使用的那些默认单词在表单加载时添加到我的自动完成中。(制作阻止添加到我列表中的单词列表) 2. 检测行已评论“//”或“/*”并阻止其中的单词添加到我的字典中。

希望您能够帮助我。请告诉我是否需要修改我的问题,我会尽快修改/更新它。

主问:

如何防止将来自richtextbox(以//或/*开头的行)中的注释词添加到自动完成中

4

3 回答 3

0

你为什么不只检查字符串开始的天气"//""/*"在你进行处理之前

    string notAllowed1 = @"//";
    string notAllowed2 = @"/*";
    var contains = false;
    foreach(string line in rtb_JS.Lines)
    {
       if (line.StartsWith(notAllowed2) || !line.StartsWith(notAllowed1))
       {
         contains = true;
         break
       }
   }
//else do nothing

使用 Linq 更新 2

    var contains = rtb_JS.Lines.ToList()
                  .Count( line => line.TrimStart().StartsWith(notAllowed2) || 
                   line.TrimStart().StartsWith(notAllowed1)) > 0 ;


if(!contains)
{
   //do your logic
}
于 2013-08-14T08:40:17.467 回答
0

我在以下行中发现了您的问题:

foreach (Match m in Regex.Matches(rtb_JS.Text, @"\b\w+\b"))
        filter[m.Value] = m.Value;

使用"\b\w+\b"正则表达式,您可以将 RichTextBox 控件中的所有单词添加到过滤器变量中。

因此,您必须更改该行中的代码,以防止添加不需要的关键字。请检查以下内容:

private IEnumerable<AutocompleteItem> BuildList()
{
    //find all words of the text
    bool bolFindMatch = false;
    var words = new Dictionary<string, string>();

    var keysToBeFiltered = new HashSet<string> { "Do", "Not" };
    var filter = words.Where(p => !keysToBeFiltered.Contains(p.Key))
                      .ToDictionary(p => p.Key, p => p.Value);

    foreach (Match m in Regex.Matches(rtb1.Text, @"\b\w+\b"))
    {
        foreach (string hs in keysToBeFiltered)
        {
            if (Regex.Matches(m.Value, @"\b" + hs + @"\b").Count > 0)
            {
                bolFindMatch = true;
                break;
            }
        }

        if (!bolFindMatch)
        {
            filter[m.Value] = m.Value;
        }
        else
        {
            bolFindMatch = false;
        }
    }

    //foreach (Match m in Regex.Matches(rtb_JS.Text, @"^(\w+)([=<>!:]+)(\w+)$"))
        //filter[m.Value] = m.Value;

    foreach (var word in filter.Keys)
    {
        yield return new AutocompleteItem(word);
    }
}
于 2013-08-14T10:01:56.053 回答
0

我认为这就是你想要的:

var filter = Regex.Matches(rtb_JS.Text, @"\b\w+\b")
                  .OfType<Match>()
                  .Where(m=>!keysToBeFiltered.Any(x=>x == m.Value))
                  .ToDictionary(m=>m.Value,m=>m.Value);

奇怪的是,您在条目中Dictionary具有KeyValue相同的值?

于 2013-08-14T09:22:52.197 回答