我正在尝试检查关键字的字符串,如果该字存在,则从字典中获取值。关键词是多词短语时存在问题。
所以我有一本字典:
Dictionary<string, string> d = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
d.Add("keyword1", "D2");
d.Add("keyword2", "D3");
d.Add("keyword3", "D4");
d.Add("keyword4", "D4");
d.Add("keyword5", "D5");
d.Add("key word six", "D6");
我有一个字符串,可能看起来如下,但将是一个随机的句子:
string errormessage = "This is an error regarding Key Word Six";
我目前正在使用以下内容检查错误消息,看看字典中是否出现任何字词:
string code = null;
string theDcode = null;
foreach (string word in errormessage.Split(' '))
{
if (d.TryGetValue(word, out theDcode))
{
code = theDcode;
}
}
问题是我无法搜索字符串“Key Word Six”,因为我逐字逐句地读取字符串,而foreach循环分别看到每个单词。这适用于单字关键词。如何处理多字关键字的检查?
答案 0 :(得分:2)
您可以在字典中迭代项目,并检查字符串是否匹配。
string errormessage = "This is an error regarding Key Word Six";
var d = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
d.Add("keyword1", "D2");
d.Add("keyword2", "D3");
d.Add("keyword3", "D4");
d.Add("keyword4", "D4");
d.Add("keyword5", "D5");
d.Add("key word six", "D6");
string code = null;
foreach (var item in d)
{
var i = errormessage.IndexOf(item.Key, StringComparison.CurrentCultureIgnoreCase);
if(i >= 0)
code = item.Value;
}
然而,这也会给你内部的匹配。例如testkeyword1test
。
修改强>
为了获得更好的性能(未经测试),您可以使用正则表达式。
string code;
var reg = new Regex(GetPatternString(d.Select (x => x.Key)), RegexOptions.IgnoreCase);
foreach (var match in reg.Matches(errormessage))
{
code = d[match.ToString()];
}
辅助功能
private static string GetPatternString(IEnumerable<string> values)
{
var sb = new StringBuilder();
foreach (var oldStr in values)
{
sb.Append("(");
sb.Append(Regex.Escape(oldStr));
sb.Append(")|");
}
return sb.ToString(0, sb.Length - 1);
}
答案 1 :(得分:0)
尝试只迭代Dictionary对象的键。
foreach (string word in d.Keys)
{
//Checks here
}
答案 2 :(得分:0)
我怀疑一个单维词典(必须有一个更好的词,但我不知道)不会起作用。你需要一棵树:
trie
类似结构:
key = key word = key word 6 = D6 key word 7 = D8
因此,当您在key
上找到匹配项时,您需要比较下一项工作,依此类推。
现在,如果你有“关键词”和“关键词6”的条目,你会怎么做?它是一个域名问题,无论是在第一场还是最后一场比赛都停止
答案 3 :(得分:0)
我猜这个算法并不可怕,但是你必须做一个检查类似
的循环“这是关于关键字六的错误”
我猜你必须在传入的搜索中找到所有唯一的子串。它可以通过循环轻松完成。但是如果我用“是一个”进行搜索,那就相当于“一个是”吗?这些词的顺序是否重要?事情开始变得复杂匆忙。好像你想要推迟像Lucene或某些搜索库这样的东西。