使用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中的注释单词(以//或/*开头的行)添加到自动完成中
我在以下行中发现了您的问题:
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
在一个条目中有Key
和Value
作为相同的值?