2010-01-08 5 views
0

J'ai un bit de code existant pour trier une liste d'objets.Conversion d'un tri de collections génériques pour utiliser Linq

productsList.Sort(
    delegate(Product p1, Product p2) 
    { 
     int result = p1.StartDatetime.CompareTo(p2.StartDatetime); 
     if (result == 0) 
     { 
      if (p1.SomeId == p2.SomeId) 
      { 
       result = 0; 
      } 
      else if (p1.SomeId == null) 
      { 
       result = -1; 
      } 
      else if (p2.SomeId == null) 
      { 
       result = 1; 
      } 
     } 
     return result; 
    }); 

J'ai le sentiment que cela peut être simplifié en le remplaçant par:

productsList = productsList 
     .OrderBy(p => p.StartDatetime) 
     .ThenBy(p => p.SomeId) 
     .ToList(); 

Ai-je raison dans mon hypothèse?

Répondre

2

Pas tout à fait mais c'est proche. Le premier pourrait commander

List<Product> productsList = new List<Product>() { 
    new Product { StartDatetime = new DateTime(2010, 1, 1), SomeId = 2 }, 
    new Product { StartDatetime = new DateTime(2010, 1, 1), SomeId = 4 } 
}; 

dans l'ordre inverse (avec SomeId égal 4 premier et SomeId égal 2 seconde), mais le second les commander comme Product avec SomeId égal 2 premier et le Product avec SomeId égal 4 secondes. Cela est dû au fait que le délégué, tel qu'il est actuellement défini, ne gère aucun cas où deux SomeId sont non nulles et différentes. Donc, en ce qui concerne le délégué concerné, les deux Product ci-dessus sont "égaux" mais, selon la requête LINQ, ils ne le sont pas.

Questions connexes