2010-10-28 5 views
2

J'ai une liste de client et j'ai besoin de trier et de grouper la liste selon la règle métier.Regroupement et tri dans linq

  • Groupe par Nom du client
  • Trier par Nom du client dans l'ordre alphabétique
  • s'il y a plusieurs résultats pour le même nom, ils doivent triés par date de naissance dans l'ordre croissant (le plus ancien est répertorié premier)

Ci-dessous l'entité.

public class Customer 
{ 
public string FirstName {get; set;} 
public string LastName {get; set;} 
public DateTime DateofBirth {get; set;} 
} 

Merci d'avance.

customers.GroupBy(c => c.FirstName) 
.Select(c => c.OrderBy(c => c.FirstName).ThenBy(c => c.LastName)); 

Répondre

2

vos règles d'affaires sont quelque peu contradictoires: Group by Customer Name implique que vous n'aurez pas plusieurs occurrences du même nom dans la liste des résultats. Pourtant, votre troisième règle est if there are several results for the same name, then they need to sorted by date of birth. Donc, si en regroupant la règle n ° 1, vous voulez dire le tri, votre requête serait simplement:

customers.OrderBy(c => c.FirstName). 
      ThenBy(c => c.LastName). 
      ThenBy(c => c.DateofBirth); 

Si vous voulez dire en fait le regroupement, la règle n ° 3 devient le critère de sélection de l'élément dans le groupe - dans ce cas, la client le plus ancien sera choisi pour chaque groupe:

customers.GroupBy(c => c.FirstName + c.LastName). 
      Select(g => g.OrderBy(c => c.DateofBirth).FirstOrDefault()). 
      OrderBy(c => c.FirstName). 
      ThenBy(c => c.LastName); 
+0

troisième règle est pour le cas si la liste ont plus l'un client ayant même prénom. À ce moment, trier par DateofBirth. –

+0

Comme je l'ai mentionné plus tôt - si vous avez plus d'un client avec le même nom, ils seront regroupés en un seul. Mais si vous ne voulez pas les "fusionner", vous n'avez pas vraiment besoin de 'GroupBy' - utilisez juste' OrderBy (...). ThenBy (...). ThenBy (...) '. Quel genre de sortie attendez-vous, btw? Si vous voulez une liste plate - utilisez 'ToList()' sur mes requêtes, au cas où vous voulez, par exemple, 'List >' - appliquer 'ToList()' à la réponse de Mark Heath. – Yakimych

0
var sortList = (from c in customers 
          group c by new 
          { 
           c.FirstName, 
           c.LastName, 
           c.DateofBirth 
          } into g 
          select new Customer() 
          { 
           FirstName = g.Key.FirstName, 
           LastName = g.Key.LastName, 
           DateofBirth = g.Key.DateofBirth 
          }).OrderBy(x => x.FirstName) 
          .ThenBy(x=> x.LastName) 
          .ThenBy(x=> x.DateofBirth); 
2

il semble un peu étrange groupe sur le nom du client, mais cela fera

var groups = from c in customers 
       let name = c.FirstName + " " + c.LastName 
       orderby name ascending, c.DateofBirth ascending 
       group c by name into g 
       select g; 
+0

Vous n'avez pas vraiment besoin de cet espace entre les noms, n'est-ce pas? – Yakimych

+0

@Yakimych Eh bien, il rend le groupe.Clé regarder un peu plus agréable –