После просмотра ответа, в котором указано, как перечислять индексы с использованием коллекции с использованием Linq, я решил написать метод расширения WhereWithIndex
, который ведет себя аналогично Where
, но функция ввода должна иметь два аргумента, элемент и индекс.C#, записывающий подпись типа для `WhereWithIndex`
Пример использования должно быть:
names = new String[] {"Bob", "Alice", "Luke", "Carol"}
names.WhereWithIndex((_, index) => index % 2 == 0) // -> {"Bob", "Luke"}
Я смог встроить эту логику в моей программе, это выглядит следующим образом:
iterable
.Select((item, index) => new {item, index})
.Where(x => condition(item, index))
.Select(x => x.item);
Но тип подписи я должен дать этому расширению метод все еще ускользает от меня. Я пробовал:
public static IEnumerable<T> WhereWithIndex(this IEnumerable<T> iterable, Predicate<T, int> condition) {
Потому что я хочу в качестве входных данных перечислимого чего-либо я не мог пометить его int
или String
поэтому я попытался с помощью T
для обозначения общности following the official documentation, условие предиката, так что я сказал так. Как выразить тип делегата с двумя аргументами, который ускользает от меня, я попытался использовать запятую для разделения аргументов, но я просто догадываюсь, как I could only fund examples of predicates with only one input.
Это дает мне ошибку:
Example.cs(22,29): error CS0246: The type or namespace name `T' could
not be found. Are you missing an assembly reference?
Любая идея о написании этого типа подписи? Если это проще в версии C# 6, было бы неплохо также упомянуть об этом.
btw, 'Where' имеет перегрузку с индексом: https://msdn.microsoft.com/en-us/library/bb549418(v=vs.110).aspx; в отношении вашей проблемы: введите общий метод: 'WhereWithIndex', если он вам еще нужен –
ASh
Вы пропустили 'T' после имени метода:' ... WhereWithIndex (...) '. –
Dennis