【问题标题】:How to iterate through keys and values of an `IDictionary`?如何遍历“IDictionary”的键和值?
【发布时间】:2017-08-17 15:20:52
【问题描述】:

如果我不知道其中的键和值的具体类型,我将如何遍历 IDictionary 的键和值,因此只想将它们视为 objects?

如果我这样做:

foreach(var x in myIDictionary) { ... }

我认为xobject。但是,我将如何从中获取KeyValue(均输入为objects),如IDictionaryEnumerator 中指定的那样?没有泛型参数的IKeyValuePair 不存在吗?

我想我可以使用MoveNext 等手动循环遍历枚举器,但我觉得必须有一种方法可以使用foreach

【问题讨论】:

  • I think x is an object 你为什么不检查它实际上是什么,而不仅仅是猜测。
  • @BernardWalters 这是一种派生自对象的类型。它可以转换为“对象”。 x 的类型不是“对象”。
  • @JosephHumfrey 如果您想了解这些项目是什么,可以查看该类型的文档。
  • @Servy - 查看答案 - 这并不完全简单(例如“没有明确的类型”与“您可以使用 DictionaryEntry,但并非总是如此”)。但请随时向我指出明确给出明确答案的文档的方向。
  • @JosephHumfrey 我完全相信您能够自行找到IDictionary 的文档。您不需要我(或其他回答者)为您找到它。

标签: c# idictionary


【解决方案1】:

您可以像这样在foreach 中明确指定DictionaryEntry 对类型:

foreach (DictionaryEntry x in myIDictionary)

虽然您应该确定它是IDictionary 的标准实现(例如HashtableDictionary<TKey, TValue>

否则它可以是枚举器中的任何内容。

【讨论】:

  • 也许这是一个挑剔的问题,但没有任何要求 IDictionaryEnumerator.CurrentDictionaryEntry,这就是 foreach 使用的。如果不是这样就很奇怪了,但不违反接口。
  • 我想我的困惑是IDictionary 的枚举器使用DictionaryEntry,而具体的Dictionary<string, int>(例如)将使用KeyValuePair<string, int>(与DictionaryEntry 无关)。所以行为实际上取决于您迭代的字典变量的特定转换。
  • @JLRishe 是的,确实
  • @JosephHumfrey 这种混乱是可以理解的。这是因为 GetEnumerator. 的显式实现而起作用的
  • @JosephHumfrey - 没关系。它仍然有效,通用的Dictionary<T,U> 仍然实现IDictionary,因为它确实可以使用DictionaryEntry,因为实现是显式接口。见dotnetfiddle
【解决方案2】:

您缺少的一点是,如果您迭代 IDictionary,则无法保证值的类型。它们实际上可以是任何东西。唯一的保证是它实现了.GetEnumerator()

如果你想迭代 IDictionary 的内容,你可以迭代它的键:

foreach (object key in myIDictionary.Keys)
{
    object value = myIDictionary[key];

    // do something with key and value
}

您还可以将IDictionary 转换为Dictionary<object, object> 以使foreach 更友好一点:

var myDictionary = myIDictionary.Keys
                                .Cast<object>()
                                .ToDictionary(k => k, k => d[k]);

// kv is a KeyValuePair<object, object>
foreach (var kv in dobj)
{

}

您甚至可以添加一个扩展方法来为您执行此操作:

public static Dictionary<object, object> ToDictionary(this IDictionary dict)
{
    return dict.Keys.Cast<object>().ToDictionary(k => k, k => dict[k]);
}


// usage
// kv is a KeyValuePair<object, object>
foreach (var kv in myIDictionary.ToDictionary())
{
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2019-05-06
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-11-22
    相关资源
    最近更新 更多