如何从c#中获取此类字典的值

时间:2013-05-27 13:00:28

标签: c# for-loop dictionary key-value

我想要创建,因为我理解字典在C#中是key=>value,字典很像key=>value(key=>value)

目前我知道我可以这样做:

Dictionary<int, int> someVar = new Dictionary<int, int>();

创建了一个键=&gt;值。

创造我想要的东西(这只是猜测,如果我错了,请纠正我):

Dictionary<int Dictionray<int, int>> someVar = new Dictionary<int, Dictionray<int, int>>

现在来了有趣的部分,我想做 ONE 而只有 ONE 来循环这个dictponary对象 YET 获取所有值所以它看起来像是:

foreach (KeyValuePair<int, int> pair in someVar){
    //object = base dictionary key
    //object2 = nested dictionary key
    //object3 = nested dictionary value 
}

现在我来自PHP,所以在一个for循环中这很容易做到。你的想法是什么?因为我是C#和术语词典的新手(尽管php数组是字典)。

我知道在C#中有一个像我这样的for循环:pair.Keypair.Value.

我的第二部分是如何为这样的字典添加值?我知道典型的.add(bla,bla),但是如何为嵌套部分添加值?

3 个答案:

答案 0 :(得分:4)

迭代

在C#中,IDictionary<TKey, TValue>实现了IEnumerable<KeyValuePair<TKey, TValue>>。因此,您可以使用IDictionary<TKey, TValue>或Linq查询迭代foreach类型的实例,并获取数据结构中的每个KeyValuePair。由于您的TValue本身就是IDictionary,因此您也可以在内部结构上执行此操作:

foreach(var kvp in myDictionary)
{
    foreach(var innerKvp in kvp.Value)
    {
         var myValue = innerKvp.Value
         //Logic on myValue
    }
}

使用Linq库,您可以使用SelectMany非常优雅地获取所有KeyValuePair个实例:

myDictionary.SelectMany(kvp => kvp.Value);

SelectMany基本上会压缩列表列表。这个Linq查询说:对于我的字典中的每个键值对,获取所有内部字典,将它们视为键值对列表,然后展平所有这些列表。这将返回IEnumerable<KeyValuePair<TKey, TValue>>

如果您只关心内部字典的值而不关心键,则可以使用Values上的IDictionary<TKey, TValue>属性,该属性返回IEnumerable<TValue>的所有值词典。然后我们可以使用SelectMany来获取包含字典词典中所有值的列表:

myDictionary.Values.SelectMany(dict => dict.Values);

详细了解IDictionary<TKey, TValue> here以及KeyValuePair<TKey, TValue> here的更多信息。

<强>添加

为了向此数据结构添加元素,您必须首先检查内部字典是否为空。假设我们正在尝试将3添加到由2键入的字典中由1键入的词典中:

var myInnerDictionary = myDictionary.ContainsKey(1) ? myDictionary[1] : (myDictionary[1] = new Dictionary<int, int>());
myInnerDictionary[1][2] = 3;

当然,如果该位置已存在,则会覆盖该位置的值,因此您可能也想检查该值,或者使用不会覆盖的Add方法。

您还应该了解ToDictionary Linq方法,该方法可以帮助您构建其他IEnumerables的词典。阅读它here

答案 1 :(得分:0)

使用linq获取所有值

var values = someVar.SelectMany(x => x.Values);

至于如何将值添加到嵌套部分,您只需要外部字典的键,以便将要添加到的子字典添加到:

someVar[key].Add(0, 0);

答案 2 :(得分:0)

除非嵌套foreach具有您可以在不使用循环的情况下获得的值,否则无法获取包含仅使用一个Dictionaries循环的所有值的所有值,如下所示:

foreach (var pair in someVar){
    var object1 = (Dictionary<int,int>)pair.Value;
    var object2 = object1[0].Value;
    var object3 = object1[1].Value; 
    .....

    // To add a values to the nested Dictionary just use Dictionary.Add method:
    object1.Add(1,1);
}