如何在C#中的foreach
循环中获取当前元素的键?
例如:
foreach ($array as $key => $value)
{
echo("$value is assigned to key: $key");
}
int[] values = { 5, 14, 29, 49, 99, 150, 999 };
foreach (int val in values)
{
if(search <= val && !stop)
{
// Set key to a variable
}
}
答案 0 :(得分:23)
Grauenwolf's way是使用数组执行此操作的最直接,最高效的方法:
使用for循环或创建一个在每次传递时递增的临时变量。
这当然是这样的:
int[] values = { 5, 14, 29, 49, 99, 150, 999 };
for (int key = 0; key < values.Length; ++key)
if (search <= values[key] && !stop)
{
// set key to a variable
}
使用.NET 3.5,您也可以采用更具功能性的方法,但在网站上更加冗长,并且可能依赖于support functions visiting个{{3}}个元素。 IEnumerable的。如果这就是你所需要的,那就太过分了,但如果你倾向于进行大量的收集处理,那就太方便了。
答案 1 :(得分:20)
如果你想获得密钥(读取:索引),那么你必须使用for循环。如果你真的想拥有一个包含键/值的集合,那么我会考虑使用HashTable或Dictionary(如果你想使用Generics)。
Dictionary<int, string> items = new Dictionary<int, string>();
foreach (int key in items.Keys)
{
Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}
希望有所帮助, 泰勒
答案 2 :(得分:8)
使用DictionaryEntry和KeyValuePair:
基于
MSDN
IDictionary<string,string> openWith = new Dictionary<string,string>()
{
{ "txt", "notepad.exe" }
{ "bmp", "paint.exe" }
{ "rtf", "wordpad.exe" }
};
foreach (DictionaryEntry de in openWith)
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}
// also
foreach (KeyValuePair<string,string> de in openWith)
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}
答案 3 :(得分:3)
唉,没有内置的方法可以做到这一点。使用for循环或创建一个在每次传递时递增的临时变量。
答案 4 :(得分:3)
我在这个问题的另一个版本中回答了这个问题:
Foreach用于迭代 实现的集合 IEnumerable的。它通过调用来做到这一点 关于集合的GetEnumerator,其中 将返回一个枚举器。
这个枚举器有一个方法和一个 属性:
* MoveNext() * Current
Current返回该对象 Enumerator目前在,MoveNext 更新当前的下一个对象。
显然,索引的概念是 对于枚举的概念来说, 并且无法完成。
因此,大多数收藏品都是 能够使用索引器遍历 和for循环结构。
我非常喜欢使用for循环 这种情况与追踪相比 带有局部变量的索引。
How do you get the index of the current iteration of a foreach loop?
答案 5 :(得分:1)
实际上,如果要循环遍历数组,则应使用classic for(;;)循环。但是您使用PHP代码实现的类似功能可以通过C#实现,就像使用Dictionary:
一样Dictionary<int, int> values = new Dictionary<int, int>();
values[0] = 5;
values[1] = 14;
values[2] = 29;
values[3] = 49;
// whatever...
foreach (int key in values.Keys)
{
Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}
答案 6 :(得分:0)
这是我刚刚提出的解决此问题的解决方案
原始代码:
int index=0;
foreach (var item in enumerable)
{
blah(item, index); // some code that depends on the index
index++;
}
更新了代码
enumerable.ForEach((item, index) => blah(item, index));
扩展方法:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T, int> action)
{
var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can't return a void
enumerable.Select((item, i) =>
{
action(item, i);
return unit;
}).ToList();
return pSource;
}
答案 7 :(得分:0)
您可以使用扩展方法自行实现此功能。例如,以下是一个扩展方法KeyValuePairs的实现,它适用于列表:
public struct IndexValue<T> {
public int Index {get; private set;}
public T Value {get; private set;}
public IndexValue(int index, T value) : this() {
this.Index = index;
this.Value = value;
}
}
public static class EnumExtension
{
public static IEnumerable<IndexValue<T>> KeyValuePairs<T>(this IList<T> list) {
for (int i = 0; i < list.Count; i++)
yield return new IndexValue<T>(i, list[i]);
}
}
答案 8 :(得分:-9)
myKey = Array.IndexOf(values, val);