Sprawdź metodę rozszerzenia LINQ OrderBy.
MyList.OrderBy (p => p.Category);
Jeśli potrzebujesz bardziej złożony sposób uporządkować kategorie, można utworzyć klasę, która implementuje interfejs IComparer i realizować swoją logikę sortowania w nim.
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);
}
}
}
Można to zrobić bez używania 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));
}
Albo, z wykorzystaniem 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));
}
IMHO, to raczej niedogodność, ponieważ widzę "uporządkowaną listę" jako widok na oryginalne dane. Dlatego wolę pozostawić oryginalną listę "nietkniętą". –
@FrederikGheysels Na szczęście możesz wybrać :-) – xanatos
@xanatos dziękuję CompareTo działa :) – AshOoO