Un poco tarde en el juego, lo sé ... pero esto es lo que hice recientemente. Es ligeramente diferente a la suya, pero le permite al programador dictar lo que la operación de igualdad necesita ser (predicado). Lo cual me parece muy útil cuando trato con diferentes tipos, ya que entonces tengo una forma genérica de hacerlo, independientemente del tipo de objeto y <T>
integrado en el operador de igualdad.
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 tendrá que 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;
}
Espero que esto ayude a alguien.
El problema con un enfoque 'Max' es que una: se sigue buscando, y b: devuelve el ** último ** índice cuando hay duplicados (la gente suele esperar el primer índice) –
[geekswithblogs.net] (http://geekswithblogs.net/BlackRabbitCoder/archive/2011/01/06/c. net-ndash-finding-an-itemrsquos-index-in-ienumerablelttgt.aspx) compara 4 soluciones y su rendimiento. El truco 'ToList()/FindIndex()' funciona mejor – nixda