2013-01-05 55 views
1

我有一種方法可以根據字符串去除描述字,但我相信有更有效的方法來做到這一點。需要一種更好的方法去除字符串中的模式

iMonster可以像脂肪獸人盜賊,我想刪除脂肪

private static string[] _adjectives = { "angry", 
              "big", 
              "fat", 
              "happy", 
              "large", 
              "nasty", 
              "fierce", 
              "thin", 
              "small", 
              "tall", 
              "short" }; 

    private static string RemoveMonsterAdjective(string iMonster) 
    { 
     foreach (string adjective in _adjectives) 
     { 
      if (iMonster.Contains(adjective)) 
      { 
       iMonster = iMonster.Replace(adjective, "").Trim(); 
       break; 
      } 
     } 
     return iMonster; 
    } 

希望有人能幫助我。提前致謝。

+2

看起來不錯。這對你來說真的是一個瓶頸嗎? – Oded

+5

您的代碼看起來不錯。只有一件事:因爲如果魔鬼是一個「胖胖的討厭的獸人流氓」,因爲「休息」,你會得到「肥胖討厭的獸人流氓」。 – nemesv

+0

@lakedoo只要你管理你的'形容詞'數組,看起來很好。但是,您需要一種方法來刪除多個'形容詞',就像刪除多個分隔符一樣;)+1 @nemesv – bonCodigo

回答

4

另一個可能的短期解決方案是:

var words = iMonster.Split(' '); 
return string.Join(" ", words.Except(_adjectives)); 

我已經做了一些分析和比較了各種解決方案。

隨着輸入fat angry orc happy rogue 1000000迭代:

00:00:01.8457067 lakedoo 
00:00:01.9772477 Eve 
00:00:04.3859120 dasblinkenlight 

需要提及的是我適應dasblinkenlight的解決方案,在正則表達式的所有形容詞。

編輯:通過刪除休息糾正lakedoo的方法。

+0

+1非常好的解決方案 –

5

您可以使用正則表達式做所有的替代品在一個單一的呼叫,像這樣:

return Regex.Replace(
    iMonster, 
    @"\b(angry|big|fat|happy|...)\b", 
    "" 
).Trim(); 

這種做法背後的想法是建立一個正則表達式任何形容詞匹配爲一個字(所以「bigot」不匹配,而「big」匹配),並用空字符串替換該單詞。

這是demo on ideone

+1

我有興趣看到這個的基準和循環String.Replace。我懷疑,隨着輸入變長和包含更多形容詞,正則表達式將克服其初始開銷並最終更快(更少的重新分配)。 – ssube

+0

這個解決方案留下字詞之間的空格 –

+0

@lazyberezovsky就像原始代碼一樣。 –

相關問題