我是新手,目前正在将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#没有相同的迭代器结构。
答案 0 :(得分: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()
您必须选择如何处理clone()
。即使在C ++中被引用,他们选择clone()
Object
也有点奇怪。如果您想clone()
它,显然您需要为CloneableObject
公开一种方法来克隆它。请注意,C#中的Object
(或object
)无法“开箱即用”。你必须编写代码来克隆它。
答案 1 :(得分:0)
如果我理解正确,你需要c#
字典上的迭代器。您可以使用以下方法之一迭代dictionary
c#
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;
}
您可以在if
循环中添加foreach
子句并进行处理。