2009-01-12 12 views
5

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

8

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).

+0

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

0

Utilice el método de extensión Última() que se encuentra en el espacio de nombres System.Linq.

+0

Eso no aplica el predicado ... –

1

puede agregar su colección a una nueva lista pasándola a List <> constructor.

List<MyClass> myList = new List<MyClass>(MyCol); 
myList.FindLast.... 
4

¿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; 
    } 
} 
+0

¿No podemos simplemente editar eso en la respuesta de skeet? –

+0

La parte superior, tal vez, pero pensé que las cosas 2.0 podrían ser útiles, así que lo mantuve separado. –

+0

¡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! –

0

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.