[C#, Linq] Как бы получить index элемента во всех функциях?
var index = 0;
var result = list.Any(n => n == index++);
Вообще использовать значение, возвращаемое ++ как-то не очень хорошо, по-моему. Заставляет напрягаться и вспоминать, который из префиксного и постфиксного что делает.
Ну а что произойдёт, когда некто захочет поюзать индекс в двух местах, не хочется даже представлять.
например ToDictionary когда нужен index
items.Selectitem, index) => new {Item=item, Index=index})
.ToDictionary(indexedItem => indexedItem.Item, indexedItem => indexedItem.Index);
Мне в моей скромной задаче словарь нафиг не нужен и я бы обошёлся чем-нибудь вроде
items.Selectitem, index) => blablabla).Execute;
Где Execute фигурально выражаясь посылает элементы в дев/нулл.
Кстати да, это почти совсем то, что мне нужно.
Но всё-таки остаётся вопрос, нельзя ли сделать такой же декоратор, как я показал, присобачивающий к лямбде счётчик, но чтобы он не прерывал типовыведение?
Заставляет напрягатьсяА то что ты хочешь для добавление индекса использовать какое то чудовище, это не напрягает?
Имхо, незачем глумится над недо фя. Пара тройка функций с явной реализацией индекса лучший вариант.
Оставить комментарий
bleyman
Некоторые функции System.Linq.Enumerable, типа Select, SelectMany, Where, SkipWhile и TakeWhile умеют принимать делегаты вида Func<TSource, int, TResult> selector, которым передают номер элемента. А некоторые, типа All и Any, не умеют, что как бы слегка напрягает.Можно сделать что-то вроде такого:
... но типовыводитель, к сожалению, на ней спотыкается, то есть
list.Any(Func.AddCounters, cnt) => ... ;
написать не получается, приходится явно указывать типы, либо AddCounter<string, bool>(...) либо в лямбде. Потому что при типовыведении лямбд типовыводитель использует expected result type, а больше нигде нет.
Как бы так покрасивее с этим побороться?
Можно у себя в явном виде оверрайднуть хотя бы Any и All, потому что на самом деле именно они чаще всего нужны в таком контексте для симуляции питоновского enumerate. Но это неинтересно.
Можно добавить бесконечный Range, джойнить с ним всё и потом пускать Any, но это вообще жутко уродливо получится.