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));
}
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'. –
@FrederikGheysels Por suerte, puede elegir :-) – xanatos
@xanatos gracias las obras CompareTo :) – AshOoO