There are 4 overloads of the SelectMany method . Two of them project the index of each source element, for example: string[] sentenceSequences = new string[] {"The quick brown", "fox jumped over","the lazy dog."}; sentenceSequences.SelectMany( // index - the position of the sequence in the sentenceSequences array (sequence, index) => // check if index is on odd position and if so call ToUpper() // ... put the sequence in other array, as the result index % 2 == 0 ? new [] {sequence.ToUpper()} : new [] { sequence } ) .Dump(); But there is no overload for projecting the index of the result also (the index of the element in the result sequence). So here an implementation of it: public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, int, TResult> resul...