3

我想创建,因为我知道字典是key=>value用 C# 编写的,一个很像的字典key=>value(key=>value)

目前我知道我可以做到:

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

这为我创造了一个关键=>价值。

创建我想要的我可以做的(这只是一个猜测,如果我错了,请纠正我):

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

现在到了有趣的部分,我想做一个,并且只有一个for 循环遍历这个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) 但是如何向嵌套部分添加值?

4

3 回答 3

4

迭代

在 C# 中,IDictionary<TKey, TValue>实现IEnumerable<KeyValuePair<TKey, TValue>>. IDictionary<TKey, TValue>因此,您可以使用foreach或 Linq 查询遍历类型实例,并获取KeyValuePair数据结构中的每一个。由于您TValue在这种情况下本身是 a 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> 这里和更多关于KeyValuePair<TKey, TValue> 这里

添加

为了向这个数据结构中添加一个元素,您必须首先检查内部字典是否为空。假设我们正在尝试在 keyed by 的字典中添加3keyed by2的字典1

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

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

您还应该了解ToDictionaryLinq 方法,它可以帮助您从其他IEnumerables. 在这里阅读。

于 2013-05-27T13:11:53.040 回答
0

使用 linq 获取所有值

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

至于如何向嵌套部分添加值,您只需要外部字典的键即可将其添加到哪个子字典:

someVar[key].Add(0, 0);
于 2013-05-27T13:05:18.343 回答
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);
}
于 2013-05-27T13:12:15.943 回答