如何在C#中从此类字典中获取值
作者:互联网
我想创建字典,因为我知道字典在C#中是key => value,是一个非常类似于key => value(key => value)的字典
目前,我知道我可以做到:
字典< int,int> someVar =新Dictionary< int,int>();
这为我创建了一个key =>值.
创建我想做的事(这只是一个猜测,如果我做错了,请纠正我):
字典< int Dictionray< int,int> someVar = new Dictionary< int,Dictionray< int,int>
现在是有趣的部分,我想做一个,并且在此字典对象YET上只有一个for循环获得所有值,因此看起来像:
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),但是如何为嵌套部分添加值?
解决方法:
反复进行
在C#中,IDictionary< TKey,TValue>实现IEnumerable< KeyValuePair< TKey,TValue>>.因此,您可以遍历类型为IDictionary< TKey,TValue>的实例.使用foreach或Linq查询,并获取数据结构中的每个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>>.
相反,如果您只关心内部字典的值而不关心键,则可以使用IDictionary< TKey,TValue>上的Values属性.返回IEnumerable< TValue>.字典中所有值的然后,我们可以使用SelectMany来获取包含字典词典中所有值的列表:
myDictionary.Values.SelectMany(dict => dict.Values);
阅读有关IDictionary< TKey,TValue>的更多信息. here及更多有关KeyValuePair< TKey,TValue>的信息. here.
新增中
为了向此数据结构添加元素,您必须首先检查内部字典是否为空.假设我们要在以1为键的字典中将3加到以2为键的字典中
var myInnerDictionary = myDictionary.ContainsKey(1) ? myDictionary[1] : (myDictionary[1] = new Dictionary<int, int>());
myInnerDictionary[1][2] = 3;
当然,如果该值已经存在,它将覆盖该位置中的值,因此您可能也要检查该值,或者使用不会覆盖的Add方法.
您还应该了解ToDictionary Linq方法,该方法可以帮助您从其他IEnumerables构造字典.阅读有关的内容here.
标签:dictionary,for-loop,key-value,c 来源: https://codeday.me/bug/20191030/1971070.html