Un poco tarde en el juego, lo sé ... pero esto es lo que hice recientemente. Es ligeramente diferente al suyo, pero permite que el programador dicte lo que la operación de igualdad debe ser (predicado). Lo cual encuentro muy útil cuando trato con diferentes tipos, ya que tengo una forma genérica de hacerlo independientemente del tipo de objeto y del <T>operador de igualdad incorporado.
También tiene una huella de memoria muy pequeña, y es muy, muy rápido / eficiente ... si te importa eso.
En el peor de los casos, solo agregará esto a su lista de extensiones.
De todos modos ... aquí está.
public static int IndexOf<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
int retval = -1;
var enumerator = source.GetEnumerator();
while (enumerator.MoveNext())
{
retval += 1;
if (predicate(enumerator.Current))
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
return retval;
}
}
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
return -1;
}
Esperemos que esto ayude a alguien.
Maxenfoque es que a: sigue buscando yb: devuelve el último índice cuando hay duplicados (la gente suele esperar el primer índice)