使用Linq从Dictionary中筛选出某些键并返回新的Dictionary 2

本文关键字:Dictionary 返回 Linq 筛选 使用 | 更新日期: 2023-09-27 18:27:47

与此问题相关:使用Linq从字典中筛选出某些密钥并返回新的字典

我得到了一个使用字典的自动完成控件。场景是我的RichTextBox(用作代码编辑器)中的每个单词都会自动添加到我的自动完成列表中。就像我在RichTextBox中键入单词"asdasdasd"一样,单词"as达斯达斯"将自动添加到我的自动完成中。

使用此代码:

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"answers"Not"仍然包括在内,以便使用上面的代码自动完成。此外,当我的表单加载时,会出现一个特定的默认脚本,该脚本必须始终存在。所以我不能改变它。

我有两种可能的解决方案来解决这个问题:1.加载表单时,不允许在我的自动完成中添加默认脚本中使用的默认单词。(列出阻止添加到我的列表中的单词)2.检测注释为"//"或"/*"的行,并阻止将其中的单词添加到我的词典中。

希望你能帮我。如果我需要修改我的问题,请告诉我,我会尽快修改/更新。

main_Q:

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

使用Linq从Dictionary中筛选出某些键并返回新的Dictionary 2

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

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);
    }
}

为什么不在处理之前先检查字符串是否以"//""/*"开头

    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
}

我想这就是你想要的:

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作为相同的值?