没有“键的索引”这样的概念。您应该始终将 aDictionary<TKey, TValue>
视为具有不可预测的顺序 - 您在迭代它时碰巧获得的顺序可能会发生变化。(所以理论上,您可以添加一个新条目,并且下次迭代它们时条目的顺序可能完全不同。理论上,这甚至可能在您不更改数据的情况下发生,但在正常实现中不太可能发生这种情况。)
如果你真的想得到你这次碰巧观察到的数字索引,你可以使用:
foreach (var x in dictionary.Select((Entry, Index) => new { Entry, Index }))
{
Console.WriteLine("{0}: {1} = {2}", x.Index, x.Entry.Key, x.Entry.Value);
}
...但请注意,这是一个相当具有误导性的显示,因为它暗示了一种固有的顺序。
从文档中:
出于枚举的目的,字典中的每个项目都被视为KeyValuePair<TKey, TValue>
表示值及其键的结构。返回项目的顺序未定义。
编辑:如果您不喜欢Select
这里的电话,您可以创建自己的扩展方法:
public struct IndexedValue<T>
{
private readonly T value;
private readonly int index;
public T Value { get { return value; } }
public int Index { get { return index; } }
public IndexedValue(T value, int index)
{
this.value = value;
this.index = index;
}
}
public static class Extensions
{
public static IEnumerable<IndexedValue<T>> WithIndex<T>
(this IEnumerable<T> source)
{
return source.Select((value, index) => new IndexedValue<T>(value, index));
}
}
那么你的循环将是:
foreach (var x in dictionary.WithIndex())
{
Console.WriteLine("{0}: {1} = {2}", x.Index, x.Value.Key, x.Value.Value);
}