【问题标题】:How to get the value out of this type of dictionary in c#如何在c#中从这种类型的字典中获取值
【发布时间】:2013-05-22 08:20:13
【问题描述】:

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

目前我知道我可以做到:

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

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

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

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

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

【问题讨论】:

  • 您的数据结构需求是否有特定的业务原因?这本词典背后的场景是什么?

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


【解决方案1】:

迭代

在 C# 中,IDictionary&lt;TKey, TValue&gt; 实现 IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;。因此,您可以使用foreach 或Linq 查询遍历IDictionary&lt;TKey, TValue&gt; 类型的实例,并获取数据结构中的每个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&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;

如果您只关心内部字典的值,而不关心键,您可以使用IDictionary&lt;TKey, TValue&gt; 上的Values 属性,它返回字典中所有值的IEnumerable&lt;TValue&gt;。然后我们可以使用SelectMany 来获取一个包含字典字典中所有值的列表:

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

阅读更多关于 IDictionary&lt;TKey, TValue&gt; here 和更多关于 KeyValuePair&lt;TKey, TValue&gt; 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

【讨论】:

    【解决方案2】:

    使用 linq 获取所有值

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

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

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

    【讨论】:

    • 谢谢。您能否更详细地解释如何从字典中获取我想要的信息?你的解释有点含糊,作为一个新手,我不明白你的意思。谢谢。
    • 本斯的回答更全面,应该有你需要的所有信息
    【解决方案3】:

    仅使用一个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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多