8 c# iteration dictionary loops
如何在保持键的索引的同时迭代Dictionary的键.我所做的是将foreach-loop与一个局部变量合并,该局部变量i在每一轮循环中递增一.
这是我的代码:
public IterateOverMyDict()
{
int i=-1;
foreach (string key in myDict.Keys)
{
i++;
Console.Write(i.ToString() + " : " + key);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用局部变量似乎真的很低技术i.我想知道是否有一种方法我不必使用"额外"变量?不是说这是一种糟糕的方式,但有更好的方法吗?
Jon*_*eet 21
没有"钥匙索引"这样的概念.你应该总是将a Dictionary<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);
}
Run Code Online (Sandbox Code Playgroud)
...但请注意,这是一个相当误导的显示,因为它表明了一种固有的顺序.
从文档:
出于枚举的目的,字典中的每个项目都被视为
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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的循环将是:
foreach (var x in dictionary.WithIndex())
{
Console.WriteLine("{0}: {1} = {2}", x.Index, x.Value.Key, x.Value.Value);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25215 次 |
| 最近记录: |