2011-04-25 13 views
5

Necesito ordenar una lista <> de objetos MediaItem por fecha de publicación ... la fecha de publicación no es una propiedad del artículo. Así que mi intención inicial era virar temporalmente una propiedad de fecha de publicación, cargarla, ordenarla y deshacerme de la propiedad. Alguien en mi trabajo sugirió que use Tuple y ordene con LINQ ... Llegué hasta aquí en mi prueba de fragmento, completando la lista <> ... pero no estoy seguro de cómo ordenar esa propiedad de fecha usando LINQ. Seguiré buscando mi lado, pero si alguien necesita ayuda, lo agradecería. Gracias.C# ordenando una Lista <> usando Tuple?

List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

      for (int i = 0; i <= 10; i++) 
      { 
       DateTime date = new DateTime(2011, i, 1); 
       MediaItem item = new MediaItem(); 
       list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
      } 

Respuesta

13

Puede usar el operador LINQ OrderBy() para realizar la clasificación; te permite pasar una función que extrae el elemento para ordenar por. Dado que el segundo miembro de la tupla es la fecha, ordenamos por Item2.

var result = list.OrderBy(x => x.Item2).ToList(); 

puede invertir el orden en LINQ utilizando OrderByDescending() en lugar de `OrdenarPor().

Además, tenga en cuenta que debe materializar los resultados o iterar sobre ellos, ya que el método OrderBy() es perezoso por defecto. El ejemplo anterior materializa una copia de la lista.

Si desea ordenar la lista en lugar (en lugar de crear una nueva), puede suministrar un delegado Comparison<T> al método Sort().

list.Sort((a,b) => a.Item2.CompareTo(b.Item2)); 

Sin embargo, se puede hacer aún mejor - si siempre desea principal de la lista en orden de clasificación, puede utilizar la clase SortedList lugar ... sin embargo, tendrá que aplicar una costumbre IComparer<Tuple<MediaItem, DateTime>> en ese caso. En este caso, cuando agrega elementos, estos se mantendrán siempre ordenados.

5

Una forma sería utilizar el método List<T>.Sort, utilizando una expresión lambda para crear el delegado Comparison<T> apropiado.

// Sorts tuples in chronological order. To use reverse chronological order, 
// use t2.Item2.CompareTo(t1.Item2) instead. 
list.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2)); 

Por supuesto, esto supone que no hay referencias nulas en la lista, que no puede haber en su ejemplo.

+0

+1 me ganaron por 30 segundos ;-) – BrokenGlass

2
List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

for (int i = 0; i <= 10; i++) 
{ 
     DateTime date = new DateTime(2011, i, 1); 
     MediaItem item = new MediaItem(); 
     list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
} 

list.Sort((a, b) => a.Item2.CompareTo(b.Item2)); 

foreach (var element in list) 
{ 
    Console.WriteLine(element); 
} 
Cuestiones relacionadas