2010-10-27 111 views

回答

3
foreach(var pair in hash) 
{ 
    mystring = mystring.Replace(pair.Key, pair.Value); 
} 

如果它確實是一個Hashtable而不是Dictionary<char, char>,那麼你可能需要轉換鍵和值到正確的類型。

或者取決於你的字典項目的數量和你的字符串的大小,它可以更快地迭代字符串:

StringBuilder sb = new StringBuilder(); 
foreach (var char in mystring) 
{ 
    char replace; 
    if (hash.TryGetValue(char, out replace)) 
    { 
     sb.Append(replace); 
    } 
    else 
    { 
     sb.Append(char); 
    } 
} 
+0

那麼這就是最高效的方法是什麼? – grady 2010-10-27 07:54:16

+0

這取決於:)第一種方法避免多次查找字典中的字符串,但會爲每個替換字符串執行一次字符串分配。第二個將分配得少得多,但是以字典中每個字符的查找爲代價。 – 2010-10-27 07:55:57

+0

實際上,除非您擔心此時的表現,否則我會使用最簡潔易懂的代碼。 – 2010-10-27 07:56:21

1

你應該通過串迴路,並使用目前的焦炭得到更換來自散列表的值。這會給你O(n)的速度。

0

什麼是littel lambda表達式?

var t = new Dictionary<char, char>(); 
t.Add('T', 'B'); 
var s = "Test"; 
s = string.Concat(s.Select(c => { return t.ContainsKey(c) ? t[c] : c ; })); 
Console.WriteLine(s); 

避免雙重查詢:

var t = new Dictionary<char, char>(); 
t.Add('T', 'B'); 
var s = "Test"; 
s = string.Concat(s.Select(c => 
    { 
     char r; 
     if(t.TryGetValue(c, out r)) 
      return r; 
     else 
      return c; 
    })); 
+0

是的,這是有效的,請記住,使用ContainsKey意味着你正在做兩個字典查找。雖然我相信避免一般的過早優化,但進入良好習慣是一件好事,避免使用TryGetValue是一件簡單的事情。 – 2010-10-27 08:39:46