如何查看字典中是否存在字符串中的多字子字符串?

时间:2013-01-17 20:38:31

标签: c# dictionary

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

所以我有一本字典:

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循环分别看到每个单词。这适用于单字关键词。如何处理多字关键字的检查?

4 个答案:

答案 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)

我猜这个算法并不可怕,但是你必须做一个检查类似

的循环

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

  1. 这是
  2. 这是
  3. 这是一个错误
  4. 这是关于
  5. 的错误
  6. 这是关于Key的错误
  7. 这是关于关键字的错误
  8. 这是关于关键字六的错误
  9. 我猜你必须在传入的搜索中找到所有唯一的子串。它可以通过循环轻松完成。但是如果我用“是一个”进行搜索,那就相当于“一个是”吗?这些词的顺序是否重要?事情开始变得复杂匆忙。好像你想要推迟像Lucene或某些搜索库这样的东西。