2011-10-24 30 views
8

Buenos días 4 u todoCómo ordenar una lista por el campo

tengo una lista de objetos

Mis objetos como

Product = "iPhone"; 
Category = "SmartPhone"; 

Product = "HP"; 
Category = "PC"; 

Product = "HTC"; 
Category = "SmartPhone"; 

Y insertar cada objeto en mi prueba por lo que su gusto

List<Myobject> MyList = new List<Myobject>(); 

y ahora necesito a Mi lista Sord/orden por la categoría

Como necesito mi lista para mostrar primero la categoría de SmartPhone otra

Respuesta

16

Puede utilizar List.Sort

l.Sort((p, q) => p.Category.CompareTo(q.Category)); 

La ventaja sobre la LINQ OrderBy es que ordenará la lista in situ en lugar de generar un IOrderedEnumerable<T> que luego deberá volver a transformar en List<T>.

+0

En mi humilde opinión, eso es una desventaja, ya que veo la 'lista ordenada' como una vista de los datos originales. Por lo tanto, prefiero dejar la lista original 'intacta'. –

+0

@FrederikGheysels Por suerte, puede elegir :-) – xanatos

+0

@xanatos gracias las obras CompareTo :) – AshOoO

13

Consulte el método de extensión LINQ OrderBy.

MyList.OrderBy (p => p.Category); 

Si usted necesita una manera más compleja para ordenar las categorías, se podría crear una clase que implementa la interfaz IComparer, e implementar la lógica de clase en ella.

 public class SmartphonesFirst : IComparer<Product> 
     { 
      const string Smartphone = "Smartphone"; 

      public int Compare(Product x, Product y) 
      { 
       if(x.Category == Smartphone && y.Category != Smartphone) 
       { 
        return -1; 
       } 
       if(y.Category == Smartphone && x.Category != Smartphone) 
       { 
        return 1; 
       } 
       else 
       { 
        return Comparer<String>.Default.Compare (x.Category, y.Category); 
       } 
      } 
     } 

Puede hacerlo sin utilizar LINQ:

  var l = new List<Product>(); 
      l.Add (new Product() 
      { 
       Name = "Omnia 7", 
       Category = "Smartphone" 
      }); 

      l.Add (new Product() 
      { 
       Name = "Mercedes", 
       Category = "Car" 
      }); 

      l.Add (new Product() 
      { 
       Name = "HTC", 
       Category = "Smartphone" 
      }); 

      l.Add (new Product() 
      { 
       Name = "AMD", 
       Category = "CPU" 
      }); 

      l.Sort (new SmartphonesFirst()); 

      foreach(var p in l) 
      { 
       Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name)); 
      } 

O, con el uso de LINQ:

  var l = new List<Product>(); 
      l.Add (new Product() 
      { 
       Name = "Omnia 7", 
       Category = "Smartphone" 
      }); 

      l.Add (new Product() 
      { 
       Name = "Mercedes", 
       Category = "Car" 
      }); 

      l.Add (new Product() 
      { 
       Name = "HTC", 
       Category = "Smartphone" 
      }); 

      l.Add (new Product() 
      { 
       Name = "AMD", 
       Category = "CPU" 
      }); 

      var sorted = l.OrderBy (p => p, new SmartphonesFirst()); 

      foreach (var p in sorted) 
      { 
       Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name)); 
      } 
4

Usted puede utilizar el método Sort y una comparación personalizada, para ordenar por categoría (descendente) y luego por producto (ascendente):

MyList.Sort((a, b) => { 
    // compare b to a to get descending order 
    int result = b.Category.CompareTo(a.Category); 
    if (result == 0) { 
    // if categories are the same, sort by product 
    result = a.Product.CompareTo(b.Product); 
    } 
    return result; 
}); 

Si desea señalar a los teléfonos inteligentes, y luego ascendente en orden:

MyList.Sort((a, b) => { 
    int result = (a.Category == "SmartPhone" ? 0 : 1) - (b.Category == "SmartPhone" ? 0 : 1); 
    if (result == 0) { 
    result = a.Category.CompareTo(b.Category); 
    if (result == 0) { 
     result = a.Product.CompareTo(b.Product); 
    } 
    } 
    return result; 
}); 
+0

+1. para ir un paso más allá para ordenar en el campo del producto cuando el campo de categoría es igual. –

Cuestiones relacionadas