Есть ли причина, по которой вам нужно это сделать?
@foreach(var x in Model.Categories) {
<li><a href="#">@x.Name</a></li>
}
Выше делает то же самое, и более идиоматично.
Я не вижу способа вывести результат делегата .ForEach()
, используя синтаксис Razor. Razor ожидает, что вызванные методы или вызванные свойства возвращают значение, которое затем передается в вывод представления. Поскольку .ForEach()
ничего не возвращает, он не знает, что с ним делать:
Невозможно явно преобразовать тип 'void' в 'object'
Вы можете получить краткий индекс итератора примерно так:
@foreach (var item in Model.Categories.Select((cat, i) => new { Item = cat, Index = i })) {
<li><a href="#">@x.Index - @x.Item.Name</a></li>
}
Если вы хотите определить это как метод расширения, а не анонимный тип, вы можете создать класс для хранения пары Item, Index
и определить метод расширения для IEnumerable<T>
, который yield
отображает элементы в оригинальный перечислимый, завернутый в эту конструкцию.
public static IEnumerable<IndexedItem<T>> WithIndex<T>(this IEnumerable<T> input)
{
int i = 0;
foreach(T item in input)
yield return new IndexedItem<T> { Index = i++, Item = item };
}
Класс:
public class IndexedItem<T>
{
public int Index { get; set; }
public T Item { get; set; }
}
Использование:
@foreach(var x in Model.Categories.WithIndex()) {
<li><a href="#">@x.Index - @x.Item.Name</a></li>
}