将字符的出现替换为字母表中的所有字母

时间:2011-11-27 17:39:45

标签: c#

我与计算机对手创建了一个拼字游戏。如果在生成单词期间在计算机机架中找到空白磁贴,则需要换掉字母表中的每个字母。我现在有解决这个问题的解决方案,但是想知道是否有更好的方法来完成这个任务。

if (str.Contains("*"))
                {
                    char c = 'A';
                    String made = "";
                    while(c < 'Z')
                    {
                        made = str.ReplaceFirst("*", c.ToString());
                        if (!made.Contains("*"))
                        {
                            wordsMade.Add(made);
                            if (theGame.theTrie.Search(made) == Trie.SearchResults.Found)
                            {
                                validWords.Add(made);
                            }
                        }
                        else
                        {
                            char ch = 'A';
                            String made2 = "";
                            while (ch < 'Z')
                            {
                                made2 = made.ReplaceFirst("*", c.ToString());
                                wordsMade.Add(made2);
                                if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
                                {
                                    validWords.Add(made2);
                                }
                                ch++;
                            }
                        }
                        c++;
                    }

2 个答案:

答案 0 :(得分:2)

Adam是正确的,可以重构代码以使其更小(实际上更小),但从根本上说,您必须检查所有26 * 26个通配符组合。因此,虽然可以使代码在语法上更有效率,但我认为你不能使它在算法上更有效率。

答案 1 :(得分:1)

这里有很多重复的代码可以重构。

这个例程是重复的,可以放在一个单独的方法中:

wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
   validWords.Add(made2);
}

这样的事情

void addWord(string newWordMade){
    wordsMade.Add(newWordMade);
    if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found)
    {
       validWords.Add(newWordMade);
    }
}

此循环结构也是重复的:

char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
   made2 = made.ReplaceFirst("*", c.ToString());
   wordsMade.Add(made2);
   if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
   {
      validWords.Add(made2);
   }
   ch++;
}

将前一个重构与这个重构与一个光滑的lambda结合起来会得到这样的结果:

void loopCharactersAndDoThis(Action<char> DoThis) {
    char ch = 'A';
    while (ch < 'Z')
    {
       DoThis(ch);
       ch++;
    }
}

else
{
   loopCharactersAndDoThis(ch => {
      string made2 = made.ReplaceFirst("*", c.ToString());
      addWord(made2);
   });
}

甚至只是:

else
{
   loopCharactersAndDoThis(ch => addWord(made.ReplaceFirst("*", c.ToString())));
}