[C#, Linq] Как бы получить index элемента во всех функциях?

bleyman

Некоторые функции System.Linq.Enumerable, типа Select, SelectMany, Where, SkipWhile и TakeWhile умеют принимать делегаты вида Func<TSource, int, TResult> selector, которым передают номер элемента. А некоторые, типа All и Any, не умеют, что как бы слегка напрягает.
Можно сделать что-то вроде такого:
		public static Func<T, R> AddCounter<T, R>(Func<T, int, R> f)
{
int cnt = 0;
return t => f(t, cnt++);
}

... но типовыводитель, к сожалению, на ней спотыкается, то есть
list.Any(Func.AddCounters, cnt) => ... ;
написать не получается, приходится явно указывать типы, либо AddCounter<string, bool>(...) либо в лямбде. Потому что при типовыведении лямбд типовыводитель использует expected result type, а больше нигде нет.
Как бы так покрасивее с этим побороться?
Можно у себя в явном виде оверрайднуть хотя бы Any и All, потому что на самом деле именно они чаще всего нужны в таком контексте для симуляции питоновского enumerate. Но это неинтересно.
Можно добавить бесконечный Range, джойнить с ним всё и потом пускать Any, но это вообще жутко уродливо получится.

timefim

var index = 0;
var result = list.Any(n => n == index++);

bleyman

Это неудобно и черевато.
Вообще использовать значение, возвращаемое ++ как-то не очень хорошо, по-моему. Заставляет напрягаться и вспоминать, который из префиксного и постфиксного что делает.
Ну а что произойдёт, когда некто захочет поюзать индекс в двух местах, не хочется даже представлять.

Dasar

я делаю через select с индексом + анонимный класс, не скажу что красиво
например ToDictionary когда нужен index

items.Selectitem, index) => new {Item=item, Index=index})
.ToDictionary(indexedItem => indexedItem.Item, indexedItem => indexedItem.Index);

bleyman

Ыыы
Мне в моей скромной задаче словарь нафиг не нужен и я бы обошёлся чем-нибудь вроде
items.Selectitem, index) => blablabla).Execute;
Где Execute фигурально выражаясь посылает элементы в дев/нулл.
Кстати да, это почти совсем то, что мне нужно.
Но всё-таки остаётся вопрос, нельзя ли сделать такой же декоратор, как я показал, присобачивающий к лямбде счётчик, но чтобы он не прерывал типовыведение?

timefim

Заставляет напрягаться
А то что ты хочешь для добавление индекса использовать какое то чудовище, это не напрягает?
Имхо, незачем глумится над недо фя. Пара тройка функций с явной реализацией индекса лучший вариант.
Оставить комментарий
Имя или ник:
Комментарий: