Tengo dos extensiones de IEnumerable:Extensiones para IEnumerable genérica
public static class IEnumerableGenericExtensions
{
public static IEnumerable<IEnumerable<T>> InSetsOf<T>(this IEnumerable<T> source, int max)
{
List<T> toReturn = new List<T>(max);
foreach (var item in source)
{
toReturn.Add(item);
if (toReturn.Count == max)
{
yield return toReturn;
toReturn = new List<T>(max);
}
}
if (toReturn.Any())
{
yield return toReturn;
}
}
public static int IndexOf<T>(this IEnumerable<T> source, Predicate<T> searchPredicate)
{
int i = 0;
foreach (var item in source)
if (searchPredicate(item))
return i;
else
i++;
return -1;
}
}
Entonces escribo este código:
Pages = history.InSetsOf<Message>(500);
var index = Pages.IndexOf(x => x == Pages.ElementAt(0));
donde Historia clase pública: IEnumerable embargo, como resultado I' No obtuve '0' como esperaba, sino '-1'. No puedo entender, ¿por qué?
¡Muchas gracias! Me olvidé por completo de esta peculiaridad de LINQ. – Seekeer
@Seekeer - ¡No hay problema, feliz de ayudar! Este es un problema desagradable, es fácil cometer esos errores. La peor parte es cuando * no * ves un error, pero el código parece funcionar bien, pero de hecho es muy lento. (Aparte del error, hay una gran diferencia en la complejidad con o sin 'ToList' aquí) – Kobi
Sí, estoy empezando a entender a las personas, a quienes no les gusta LINQ. Por cierto, ¿puedes recomendar algún buen artículo/libro sobre la eficacia y la optimización de las consultas LINQ? – Seekeer