Ответ для "послушного", "потому что C++, в 03 Стандартах говорится поведение программы, не заканчивающейся в новой строке, не определен" (перефразируемый).
ответ для любопытного здесь: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .
Сначала выберите каждый элемент с его индексом, затем отфильтруйте элементы и, наконец, извлеките исходный индекс:
var result = orderedList
.Select((x, i) => new { Item = x, Index = i })
.Where(itemWithIndex => itemWithIndex.Item.StartsWith("g"))
.FirstOrDefault();
int index= -1;
if (result != null)
index = result.Index;
Испытательный стенд:
class Program
{
static void Main(string[] args)
{
var orderedList = new List<string>
{
"foo", "bar", "baz", "qux", "quux",
"corge", "grault", "garply", "waldo",
"fred", "plugh", "xyzzy", "thud"
}.OrderBy(x => x);
// bar, baz, corge, foo, fred, garply, grault,
// plugh, quux, qux, thud, waldo, xyzzy
// Find the index of the first element beginning with 'g'.
var result = orderedList
.Select((x, i) => new { Item = x, Index = i })
.Where(itemWithIndex => itemWithIndex.Item.StartsWith("g"))
.FirstOrDefault();
int index= -1;
if (result != null)
index = result.Index;
Console.WriteLine("Index: " + index);
}
}
Вывод:
Index: 5
Вы можете использовать что-то вроде query.TakeWhile (x =>! MatchCondition (x)). Count ()
, хотя это приводит к перечислению предыдущих значений, что может быть не тем, что вам нужно.
Вы также можете использовать вариант функции "Where", которая включает индекс коллекции в качестве параметра функции предиката. См. MSDN для получения дополнительной информации.
var result = Enumerable.Range(0, 10).Where((x, i) => i == 6);
Версия может привести к пустому списку, если нет шестого элемента. Кроме того, это не оценивает предложение where, пока вы не переберете результат.