Если для «самого быстрого» вы имеете в виду «проще всего реализовать», то
Примерно так:
static int FirstIndex(this IEnumerable<T> coll, Predicate<T> pred)
{
var it = coll.GetEnumerator();
int index = 0;
while(it.MoveNext())
{
if(pred(it.Current))
{
return index;
}
index++;
}
throw new ObjectNotFoundException();
}
{"a1", "a2", "b0", "b2", "c1"}.FirstIndex(s => s.StartsWith("b"));
Или с помощью модуля Seq из F # (предостережение, я никогда не пытался использовать их из C # ... этот синтаксис, вероятно, неправильный.):
Seq.findIndex(s => s.StartsWith("b"))(strings);