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 Select
- 3. Extensión IEnumerable
- 4. IEnumerable & IEnumerator
- 5. IEnumerable OrdenarPor
- 6. IEnumerable <IEnumerable <T>> IEnumerable a <T> usando LINQ
- 7. Cómo convertir un IEnumerable <IEnumerable <T>> a un IEnumerable <T>
- 8. Obtener un IEnumerable <T> de un IEnumerable <IEnumerable <T>>
- 9. ¿Por qué IEnumerable <T> hereda de IEnumerable?
- 10. Convertir/Convertir IEnumerable en IEnumerable <T>
- 11. Diferencia entre IEnumerable e IEnumerable <T>?
- 12. Colección personalizada Implementación IEnumerable
- 13. convirtiendo iqueryableable en IEnumerable
- 14. ¿Cómo implemento IEnumerable?
- 15. Enumeración múltiple de IEnumerable
- 16. Extensiones para IEnumerable genérica
- 17. IEnumerable y orden
- 18. lectura IEnumerable varias veces
- 19. Almacenamiento en caché IEnumerable
- 20. IEnumerable a EntitySet
- 21. Datatable implementa IEnumerable?
- 22. XmlSerializer no serializará IEnumerable
- 23. IEnumerable sin datos
- 24. IEnumerable a cadena
- 25. ¿LINQ funciona con IEnumerable?
- 26. Cuente con un IEnumerable <dynamic>
- 27. Por qué IEnumerable <T> se define como IEnumerable <out T>, no IEnumerable <T>
- 28. La agrupación de artículos idénticos consecutivos: IEnumerable <T> a IEnumerable <IEnumerable <T>>
- 29. comprobar existencia entre dos IEnumerable
- 30. Cómo convertir IEnumerable a ObservableCollection?
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