2016-11-25 12 views
3

私はC#を学んでいます。単純なものを試しています。タグをカンマで区切って入力すると、メッセージを返すことができます。アイデアは、配列に分割しているすべてのタグでコードをフィルタリングする必要があるということです。辞書のタグで検索する方法

string[] tags; 
tags.Add("greeting"); 
tags.Add("hello"); 

リストと反復:

Dictionary<string[], string> messages = new Dictionary<string[], string>(); 
messages.Add(new string[] { "greeting", "hello", "hei", "hi" }, "Hello!"); 
messages.Add(new string[] { "greeting", "bye", "buh-bye", "sayonara" }, "Bye!"); 

は、タグの取得:

List<string> lista = new List<string>(); 
foreach(string tag in e.GetArg("Tag").Split(',')) 
{ 
    foreach (KeyValuePair<string[], string> entry in gifs) 
    { 
     if (entry.Key.Contains(tag)) 
     { 
      lista.Add(entry.Value); 
     } 
    } 
} 

をこれに伴う問題は、それがために、すべて満たさ項目を追加することで、変数の定義

の各タグも、バイアイテムです。これをタグの配列でフィルタリングできますか?それとも、私はそれを何度も渡す必要があります。キー配列によって

答えて

3

検索辞書

 Dictionary<string[], string> messages = new Dictionary<string[], string>(); 
     messages.Add(new string[] { "greeting", "hello", "hei", "hi" }, "Hello!"); 
     messages.Add(new string[] { "greeting", "bye", "buh-bye", "sayonara" }, "Bye!"); 

     // add tags 
     string[] tags = new string[2]; 
     tags[0] = "greeting"; 
     tags[1] = "buh-bye"; 

     List<string> lista = new List<string>(); // list to store the results 

     // loop true the keys from every row 
     // loop true the keys of the current row 
     // check if tags contains key 
     // ckeck if lista already contains the key that was recognized(no duplicates in list) 

     foreach (var value in messages.Keys) 
      foreach (var value1 in value) 
       if (tags.Contains(value1)) 
        if(!lista.Contains(messages[value])) 
         lista.Add(messages[value]); 

出力

 ========== 
     lista Count = 2 
     1: Hello 
     2: Bye! 
+0

これを実装して拡張しようとしましたが、このエラーが表示されます。 [link](http://imgur.com/a/EUiK0)。 また、変数辞書には単純な文字列としてのキーが含まれていますが、キーとして項目の文字列[]を使用していますが、これで動作しますか? – yomisimie

+0

o thats辞書のキーとして文字列[]キーがあり、文字列をキーにしているだけなので、修正します –

+0

それでも問題は残っています。最後に、すべてのタグに一致するものを持つ配列を持つ必要があります。 – yomisimie

1

私はあなたがタグで検索するための単純なクラスを使用するかもしれないと思います。このソリューションは、コードの抽象度を向上させます。 クラス例:

public class TagDictionary 
{ 
    Dictionary<string, HashSet<string>> _innerStorage = new Dictionary<string, HashSet<string>>(); 

    public void Add(IEnumerable<string> tags, string value) 
    { 
     foreach (var tag in tags) 
     { 
      if (_innerStorage.ContainsKey(tag)) 
      { 
       var hash = _innerStorage[tag]; 
       if (!hash.Contains(value)) 
       { 
        hash.Add(value); 
       } 
      } 
      else 
      { 
       _innerStorage[tag] = new HashSet<string> 
       { 
        value 
       }; 
      } 
     } 
    } 

    public HashSet<string> GetValuesByTags(IEnumerable<string> tags) 
    { 
     var result = new HashSet<string>(); 
     foreach (var tag in tags) 
     { 
      if (_innerStorage.ContainsKey(tag)) 
      { 
       result.UnionWith(_innerStorage[tag]); 
      } 
     } 
     return result; 
    } 
} 

使用例:

static void Main(string[] args) 
    { 
     var messages = new TagDictionary(); 
     messages.Add(new string[] { "greeting", "hello", "hei", "hi" }, "Hello!"); 
     messages.Add(new string[] { "greeting", "bye", "buh-bye", "sayonara" }, "Bye!"); 

     foreach (var value in messages.GetValuesByTags(new[] { "greeting", "hello" })) 
     { 
      Console.WriteLine(value); 
     } 
    } 

だけstring[]は標準Dictionaryための良いキータイプではありません。

関連する問題