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

問題は、文字列「Key Word Six」を検索できないことです。これは、文字列を単語ごとに読み取っていて、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

アルゴリズムはひどいものではないと思いますが、次のようなものをチェックするループを実行する必要があります

「これはキーワード 6 に関するエラーです」

  1. これ
  2. これは
  3. これは
  4. これはエラーです
  5. に関するエラーです。
  6. これはキーに関するエラーです
  7. これはキーワードに関するエラーです
  8. これはキーワード 6 に関するエラーです
  9. です

着信検索で一意の部分文字列をすべて見つける必要があると思います。ループで簡単に実行できます。しかし、「is an」で検索すると、それは「an is」と同等ですか? 単語の順序は重要ですか?物事は急いで複雑になり始めます。Luceneやそこにある検索ライブラリのようなものに任せたいと思うようです。

于 2013-01-17T20:59:11.240 に答える
0

Dictionary オブジェクトのキーだけを反復処理してみてください。

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