Получение элементов с индексами при обходе коллекции - C#
Формулировка задачи:
В Python можно обойти коллекцию сразу получая элементы и индексы:
Как такое сделать в C#? Пока что ничего кроме:
не пришло, есть что-то элегантнее?
for item_index, item_itself in enumerate(collection):
public static class EnumerateExtension
{
public struct IndexedItem<T>
{
public int index;
public T item;
public IndexedItem(int index, T item)
{
this.index = index;
this.item = item;
}
}
public static IEnumerable<IndexedItem<T>> Enumerate<T>(this IEnumerable<T> sequence)
{
var counter = 0;
foreach (var i in sequence)
yield return new IndexedItem<T>(counter++, i);
}
}
class Program
{
public static void Main()
{
var array = new[] { "John", "Maria", "Fred" };
foreach (var e in array.Enumerate())
Console.WriteLine("{0}: {1}", e.index, e.item);
Console.ReadKey();
}
}Решение задачи: «Получение элементов с индексами при обходе коллекции»
textual
Листинг программы
class Program
{
public class ValInd<T>
{
public T ty;
public int Index;
}
public static List<ValInd<T>> GetInd<T>(ICollection<T> array)
{
return array.Select((x, i) => new ValInd<T>() { ty = x, Index = i }).ToList();
}
static void Main(string[] args)
{
var ai = new int[10];
var ac = new char[10];
var ld = new List<DriveInfo>();
ld.Add(new DriveInfo("C"));
foreach (var v in GetInd(ai))
Console.WriteLine(v.ty + " " + v.Index);
foreach (var v in GetInd(ac))
Console.WriteLine(v.ty + " " + v.Index);
foreach (var v in GetInd(ld))
Console.WriteLine(v.ty.DriveType + " " + v.Index);
}
}