0

我正在尝试检查关键字的字符串,如果该单词存在,则从字典中获取值。当关键字是多词短语时,问题就存在了。

所以我有一本字典:

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

问题是我无法搜索字符串“关键字六”,因为我正在逐字读取字符串,而 foreach 循环会分别查看每个单词。这适用于单个单词的关键字。如何处理检查多字关键字?

4

4 回答 4

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);
}
于 2013-01-17T20:49:39.683 回答
0

尝试仅遍历 Dictionary 对象的键。

foreach (string word in d.Keys)
{
    //Checks here
}
于 2013-01-17T20:45:21.923 回答
0

我怀疑一维字典(肯定有更好的词,但我不知道)不会起作用。你需要一棵树:

类似的trie结构:

关键=
 关键词=
   关键字 6 = D6
   关键字 7 = D8

因此,当您在 上找到匹配项时key,您会比较下一个作品,依此类推。

现在,如果您同时输入“关键字”和“关键字 6”,您会怎么做?这是一个域问题,是在第一个匹配还是最后一个匹配时停止

于 2013-01-17T20:52:30.667 回答
0

我猜这个算法并不可怕,但你必须做一个循环来检查类似的东西

“这是关于关键词六的错误”

  1. 这是
  2. 这是个
  3. 这是一个错误
  4. 这是一个关于
  5. 这是关于 Key 的错误
  6. 这是关于关键字的错误
  7. 这是关于关键字六的错误
  8. 是一个

我想你必须在传入的搜索中找到所有唯一的子字符串。它可以很容易地用一个循环来完成。但是,如果我用“is an”搜索,是否相当于“an is”?单词的顺序重要吗?事情开始变得匆忙起来。似乎您想要推迟使用诸如Lucene或一些搜索库之类的东西。

于 2013-01-17T20:59:11.240 回答