4

文字列のリストをループして、その文字列が辞書の値に含まれているかどうかを確認し、その文字列を値から削除しようとしています。

現在、私は次のようにしています:

Dictionary<String, String> formValues = new Dictionary<String, String>();
formValues["key1"] = "the something at";
formValues["key2"] = "the something on";
formValues["key3"] = "the something is";

string prepositionList = "at,as,if,of,the,to,a,an,it,is,by,its";
List<string> prepositionListValues = new List<string>(prepositionList.Split(','));

foreach (string preposition in prepositionListValues)
{
    List<string> keys = new List<string>(formValues.Keys);
    foreach (string key in keys)
    {
        if (formValues[key] != null)
        {
            if (formValues[key].Contains(preposition))
            {
                formValues[key] = formValues[key].Replace(preposition, "");
            }
        }
    }
}

私には、これは少し長く見えます。これを行う「より良い」方法はありますか?

4

4 に答える 4

5

基になる IEnumerable の KeyvaluePair エントリを繰り返すだけです。

foreach (var kvp in formValues)
{
    if (kvp.Value != null && kvp.Value.Contains(preposition))
    {
        formValue[kvp.Key] = kvp.Value.Replace(preposition, "");
    }
}

警告: 列挙中にコレクションを変更することは、めったに良い計画ではありません。この場合は大丈夫だと思います。

いずれかの方法、

ここで実際に達成しようとしているのは、複数の置換です。

正規表現を使用しない理由:

private static readonly myRegex = new Regex("at|as|if|of|the|to|a|an|it|is|by|its", 
                RegexOptions.Compiled | RegexOptions.IgnoreCase);

// ..

someValue = myRegex.Replace(someValue, "");

IgnoreCaseあなたがそれについて知らなかった場合に備えて、私は示しました。あなたのコードに適用できるようです。

于 2013-10-22T21:49:50.863 に答える
1

私はおそらく次のようなことをするでしょう:

Dictionary<string,string> Clean( Dictionary<string,string> dictionary , params string[] words )
{
  string pattern = @"\b(" + string.Join( "|" , words.Select( Regex.Escape ) ) + @")\b" ;
  Regex rx = new Regex(pattern,RegexOptions.IgnoreCase) ;

  foreach ( string key in dictionary.Keys )
  {
    dictionary[key] = rx.Replace(dictionary[key],"") ;
  }

  return dictionary ;
}
于 2013-10-22T22:11:55.653 に答える
0

状態の各変化が特定のキャラクターであるオートマトンを作成するのはどうでしょうか。次に、何かを見つけたい場合は、オートマトン ツリーをたどって、検索したものが存在する終点に到達する必要があります。

于 2013-10-22T22:47:39.647 に答える
0

パフォーマンスに関しては、三分探索木など、ある種の二分探索木を検討することもできます。

于 2013-10-22T22:00:24.027 に答える