2011-10-24 18 views
8

Dzień dobry 4 u wszystkichJak posortować listę według polu

Mam listę obiektów

Moi obiektów jak

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

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

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

I wstawić każdy obiekt do mojego testu więc jej jak

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

A teraz muszę SORD/zlecenia listy podr kategorią

Ponieważ potrzebuję mojej listy, aby wyświetlić najpierw kategorię SmartPhone, a następnie inną

Odpowiedz

16

Można użyć List.Sort

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

przewagę nad LINQ OrderBy jest to, że zamawiasz listę na miejscu, zamiast generować IOrderedEnumerable<T>, którą następnie musisz ponownie przekształcić w List<T>.

+0

IMHO, to raczej niedogodność, ponieważ widzę "uporządkowaną listę" jako widok na oryginalne dane. Dlatego wolę pozostawić oryginalną listę "nietkniętą". –

+0

@FrederikGheysels Na szczęście możesz wybrać :-) – xanatos

+0

@xanatos dziękuję CompareTo działa :) – AshOoO

13

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)); 
      } 
4

Można użyć metody Sort i porównanie niestandardowy, aby posortować według kategorii (malejąca), a następnie produktu (rosnąco):

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; 
}); 

Jeśli chcesz wyróżnić smartfony, a następnie posortować rosnąco:

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. aby przejść o krok dalej, aby posortować pole produktu, gdy pole kategorii jest równe. –

Powiązane problemy