2013-03-14 36 views
3

有没有办法使用IEnumerableFor Each -Loop通过SortedDictionary中的多个定义进行解析?我想基本上用它作为一个简单的数据库结构,我猜。例如,假设我的字典用于旋转文章,如下所示。对于一个句子中的每个单词(我的字符串),我会使用同义词(我的定义)创建该字符串的新版本。这甚至是最好的选择?这是我到目前为止有:使用C排列多个字典值

string testSentence = "Take it or beat it."; 

List<string> allSynonyms = SynonymUtility.AlternativesOf(testSentence).ToList(); 
variations.AddRange(allSynonyms); 


public class SynonymUtility 
{ 
    private static readonly SortedDictionary<char, string> synonymList = new SortedDictionary<char, string> 
    { 
     {'but', "however"}, 
     {'take', "abduct, abstract, accroach"}, 
     {'beat', "hit, lash, punch, shake"}, 
     {'end', " butt, confine, cusp"}; 
    } 

    public static IEnumerable<string> AlternativesOf(string arg) 
    { 
     arg = arg.ToLower(); 
     string[] words = arg.Split(" ")); 
     //END HERE I AM STUCK... 
    }  

因此,大家可以看到,我对我的方式来解决,但我不能想出如何采取每一个分割的话,并与各替换它们字典中的同义词。每个尝试只会替换一个项目......所以最后会有9个排列的句子串。

无论如何,任何帮助,将不胜感激。

+0

为什么不只是有一个List 作为你的字典价值? – 2013-03-14 23:29:39

+0

你会怎么做?它不需要每个单词的单独列表吗? – Jeagr 2013-03-14 23:37:21

+1

你可以做'Dictionary > myDictionary = new Dictionary >;'然后你可以在字典中添加一个列表或者添加一个新的同义词到像这样的'myDictionary [“节点“] .Add(”hit“);' – 2013-03-14 23:45:18

回答

3

这可以解决你的问题:

你同义词词典我已经修改了结构,使值列表:

private static readonly SortedDictionary<string, List<string>> synonymList 
      = new SortedDictionary<string, List<string>> 
      { 
       {"but", new List<string> { "however" }}, 
       {"take", new List<string> { "abduct", "abstract", "accroach"}}, 
       {"beat", new List<string> {"hit", "lash", "punch", "shake"}}, 
       {"end", new List<string> {"butt", "confine", "cusp"}} 
      }; 

功能输出所有替代句子:

public static IEnumerable<string> AlternativesOf(string arg) 
    { 
     //First of all, build up a 2d array of all your options 
     var words = arg.Split(' ').Select(w=> w.ToLower()).ToList(); 
     var options = new List<List<string>>(); 

     foreach (var word in words) 
     { 
      if (synonymList.ContainsKey(word)) 
      { 
       //Add the original word to the list of synonyms 
       options.Add(synonymList[word] 
           .Concat(new List<string> { word }).ToList()); 
      } 
      else 
      { 
       //Just use the original word only 
       options.Add(new List<string> { word }); 
      } 
     } 

     //Now return all permutations of the 2d options array 
     return AllPermutationsOf("", options, 0); 
    } 

函数得到所有排列:

public static IEnumerable<string> AllPermutationsOf 
      (string sentence, List<List<string>> options, int count) 
    { 
     if (count == options.Count) 
     { 
      yield return sentence; 
     } 
     else 
     { 
      foreach (string option in options[count]) 
      { 
       foreach (var childOption in AllPermutationsOf 
          (sentence + " " + option, options, count + 1)) 
       { 
        yield return childOption; 
       } 
      } 
     } 
    } 

用法示例:

string testSentence = "Take it or beat it."; 
var alternatives = AlternativesOf(testSentence).ToList(); 

     /* Output: 

      abduct it or hit it. 
      abduct it or lash it. 
      abduct it or punch it. 
      abduct it or shake it. 
      abduct it or beat it. 
      abstract it or hit it. 
      abstract it or lash it. 
      abstract it or punch it. 
      abstract it or shake it. 
      abstract it or beat it. 
      accroach it or hit it. 
      accroach it or lash it. 
      accroach it or punch it. 
      accroach it or shake it. 
      accroach it or beat it. 
      take it or hit it. 
      take it or lash it. 
      take it or punch it. 
      take it or shake it. 
      take it or beat it. */ 
+0

完美!虽然我只是在寻找一些指针,但我非常感谢帮助。再次感谢! – Jeagr 2013-03-15 00:21:38