如何遍历“IDictionary”的键和值?
Posted
技术标签:
【中文标题】如何遍历“IDictionary”的键和值?【英文标题】:How to iterate through keys and values of an `IDictionary`? 【发布时间】:2017-08-17 15:20:52 【问题描述】:如果我不知道其中的键和值的具体类型,我将如何遍历 IDictionary
的键和值,因此只想将它们视为 object
s?
如果我这样做:
foreach(var x in myIDictionary) ...
我认为x
是object
。但是,我将如何从中获取Key
和Value
(均输入为object
s),如IDictionaryEnumerator
中指定的那样?没有泛型参数的IKeyValuePair
不存在吗?
我想我可以使用MoveNext
等手动循环遍历枚举器,但我觉得必须有一种方法可以使用foreach
!
【问题讨论】:
I think x is an object
你为什么不检查它实际上是什么,而不仅仅是猜测。
@BernardWalters 这是一种派生自对象的类型。它可以转换为“对象”。 x
的类型不是“对象”。
@JosephHumfrey 如果您想了解这些项目是什么,可以查看该类型的文档。
@Servy - 查看答案 - 这并不完全简单(例如“没有明确的类型”与“您可以使用 DictionaryEntry
,但并非总是如此”)。但请随时向我指出明确给出明确答案的文档的方向。
@JosephHumfrey 我完全相信您能够自行找到IDictionary
的文档。您不需要我(或其他回答者)为您找到它。
【参考方案1】:
您可以像这样在foreach
中明确指定DictionaryEntry
对类型:
foreach (DictionaryEntry x in myIDictionary)
虽然您应该确定它是IDictionary
的标准实现(例如Hashtable
或Dictionary<TKey, TValue>
)
否则它可以是枚举器中的任何内容。
【讨论】:
也许这是一个挑剔的问题,但没有任何要求IDictionaryEnumerator.Current
是 DictionaryEntry
,这就是 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())
【讨论】:
以上是关于如何遍历“IDictionary”的键和值?的主要内容,如果未能解决你的问题,请参考以下文章