我想要创建,因为我理解字典在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.Key
和pair.Value.
我的第二部分是如何为这样的字典添加值?我知道典型的.add(bla,bla),但是如何为嵌套部分添加值?
答案 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);
}