访问C#字典中的元素

时间:2015-05-04 08:33:34

标签: c# c++ dictionary iterator

我是新手,目前正在将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 个答案:

答案 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子句并进行处理。