2015-05-04 89 views
0

我是一位正在將C++代碼轉換爲C#的新手。我有一個地圖訪問C#詞典中的元素

map<string, Object*> table; 

和功能

void define(const string& symbol, Object* definition) 
{ 
    map<string, Object*>::iterator iter = table.find(symbol);//returns iterator to element with key "symbol," else sets equal to map::end 
    if (iter != table.end())//if key is in map 
    { 
     delete (*iter).second; 
     table.erase(iter); 
    } 
    table.insert(pair<string, Object*>(symbol,definition->clone())); 
} 

,我要創建C#中的等價功能。我創建了一個解釋:

private Dictionary<string, Object> table = new Dictionary<string, Object>(); 

,這裏是我的功能至今

public void define(string symbol, Object definition) 
    { 
     if (table.ContainsKey(symbol)) 
     { 
//function body 
     } 

,現在需要我的函數體來完成同樣的事情。從我的研究來看,它似乎不像C#具有相同的迭代器結構。

+2

小心。 C++和C#中的許多東西看起來很相似,但處理方式完全不同。值得注意的是,確保你理解C++和C#中值,指針和引用的處理之間的差異;在這個代碼片段中,我可以看到你'刪除了之前存在的值,並將其替換爲作爲參數傳遞的值的克隆。確保你理解這背後的原因--xanatos的答案在C#中可能非常好,但它也可能完全錯誤。當然,你真的*想要使用'object'嗎?這有點可疑。 – Luaan

+0

請注意,C++只是很複雜,因爲它愚蠢地嘗試使用原始指針來管理內存。使用更明智的映射類型('Object',或可能'unique_ptr '),它將簡單地爲'table [symbol] = definition'(可能帶有「move」)。我想象等效的C#會和那個類似。 –

回答

3

你到底方法替換元素(如果存在),或者將其添加...在C#中,你可以簡單地說:

public void define(string symbol, Object definition) 
{ 
    table[symbol] = definition; 
} 

注意,如果definition可以IDisposable和你的擁有者,那麼這將是更好的Dispose()它,以類似的方式)在C中使用的一個++

public void define(string symbol, Object definition) 
{ 
    object oldDefinition; 

    if (table.TryGetValue(symbol, out oldDefinition) && oldDefinition != null) 
    { 
     IDisposable disp = oldDefinition as IDisposable; 

     if (disp != null) 
     { 
      disp.Dispose(); 
     } 
    } 

    table[symbol] = definition; 
} 

對於克隆(

您必須選擇如何處理clone()。即使在C++中也是引用,有點奇怪,他們選擇了clone()Object。如果你想clone()它,顯然你需要公開你的CloneableObject克隆它的方法。請注意,C#中的Object(或object)不是「開箱即用」可複製的。你必須編寫代碼來克隆它。

0

如果我理解正確,你需要在c#字典上的迭代器。您可以使用以下方法之一來遍歷dictionaryc#

foreach(var pair in table) 
{ 
    var key = pair.Key; 
    var value = pair.Value; 
} 

foreach(KeyValuePair<string, Object> entry in table) 
{ 
    // do something with entry.Value or entry.Key 
} 

for (int index = 0; index < table.Count; index++) { 
    var item = table.ElementAt(index); 
    var itemKey = item.Key; 
    var itemValue = item.Value; 
} 

可以在foreach循環添加if條款和處理它。