Me gustaría llamar al FindLast
en una colección que implementa IEnumerable
, pero FindLast
solo está disponible para List
. ¿Cuál es la mejor solución?FindInstalt on IEnumerable
Respuesta
El equivalente a:
var last = list.FindLast(predicate);
es
var last = sequence.Where(predicate).LastOrDefault();
(El último tendrá que comprobar todos los elementos en la secuencia, sin embargo ...)
Efectivamente, "Where()" es la parte Find, y "Last()" es la última parte de "FindLast". "respectivamente. Del mismo modo, FindFirst(predicate)
sería un mapa para sequence.Where(predicate).FirstOrDefault()
y FindAll(predicate)
sería sequence.Where(predicate)
.
Utilice el método de extensión Última() que se encuentra en el espacio de nombres System.Linq.
Eso no aplica el predicado ... –
puede agregar su colección a una nueva lista pasándola a List <> constructor.
List<MyClass> myList = new List<MyClass>(MyCol);
myList.FindLast....
¿Qué tal con LINQ a Objetos:
var item = data.LastOrDefault(x=>x.Whatever == "abc"); // etc
Si sólo dispone de C# 2, se puede utilizar un método de utilidad en su lugar:
using System;
using System.Collections.Generic;
static class Program {
static void Main() {
int[] data = { 1, 2, 3, 4, 5, 6 };
int lastOdd = SequenceUtil.Last<int>(
data, delegate(int i) { return (i % 2) == 1; });
}
}
static class SequenceUtil {
public static T Last<T>(IEnumerable<T> data, Predicate<T> predicate) {
T last = default(T);
foreach (T item in data) {
if (predicate(item)) last = item;
}
return last;
}
}
¿No podemos simplemente editar eso en la respuesta de skeet? –
La parte superior, tal vez, pero pensé que las cosas 2.0 podrían ser útiles, así que lo mantuve separado. –
¡Ah, solo vi v1! Ni siquiera consideró que uno iría e invertir el tiempo para expandirlo como lo hizo ... BTW para todas estas cosas de tipo Util, PowerCollections solía ser mi martillo cuando estaba limitado a 2.0 - algoritmos .cs es una gran lectura. ¡Apueste que Last() tiene una opción para Collection! –
Su pregunta no es válida porque una colección tiene no hay un ultimo elemento Una colección más especializada que tiene un pedido completo es una lista. Una colección más especializada que no tiene un pedido es un diccionario.
- 1. IList vs IEnumerable for Collections on Entities
- 2. IEnumerable & IEnumerator
- 3. Extensión IEnumerable
- 4. IEnumerable Select
- 5. IEnumerable OrdenarPor
- 6. Cómo convertir un IEnumerable <IEnumerable <T>> a un IEnumerable <T>
- 7. IEnumerable <IEnumerable <T>> IEnumerable a <T> usando LINQ
- 8. Obtener un IEnumerable <T> de un IEnumerable <IEnumerable <T>>
- 9. Diferencia entre IEnumerable e IEnumerable <T>?
- 10. ¿Por qué IEnumerable <T> hereda de IEnumerable?
- 11. Convertir/Convertir IEnumerable en IEnumerable <T>
- 12. IEnumerable a EntitySet
- 13. Colección personalizada Implementación IEnumerable
- 14. ¿Cómo implemento IEnumerable?
- 15. XmlSerializer no serializará IEnumerable
- 16. IEnumerable y orden
- 17. convirtiendo iqueryableable en IEnumerable
- 18. Almacenamiento en caché IEnumerable
- 19. Enumeración múltiple de IEnumerable
- 20. IEnumerable a cadena
- 21. ¿LINQ funciona con IEnumerable?
- 22. Extensiones para IEnumerable genérica
- 23. lectura IEnumerable varias veces
- 24. IEnumerable sin datos
- 25. Datatable implementa IEnumerable?
- 26. Cuente con un IEnumerable <dynamic>
- 27. La agrupación de artículos idénticos consecutivos: IEnumerable <T> a IEnumerable <IEnumerable <T>>
- 28. Por qué IEnumerable <T> se define como IEnumerable <out T>, no IEnumerable <T>
- 29. LINQ: ¿Cómo declarar IEnumerable [AnonymousType]?
- 30. comprobar existencia entre dos IEnumerable
Según el método de comparación, la longitud de la lista y la frecuencia de coincidencias, podría ser más eficiente de la CPU a: sequence.Reverse.Where (predicate) .FirstOrDefault(); Sin embargo, no es muy eficiente con la memoria. – mancaus