2009-08-20 6 views
0

I ont 3 niveaux pour un PlanSolution 1,2,3 et je dois trier par .levelId d'abord, puis alphabétiquement les solutions appartenant à ce niveau par .nameC# multiple de tri

PlanSolution[] planSolutions = wsAccess.GetPlanSolutionsForPlanRisk(planRisk.Id); 
        List<PlanRisk> planSolutionsList = new List<PlanRisk>(planSolutions); 


        planSolutionsList.Sort(delegate(PlanSolution x, PlanSolution y) 
        { 
         //HELP lol 
        }); 
+1

Vous n'avez pas besoin de créer une liste '' juste pour faire le tri. Utilisez simplement la méthode 'Array.Sort()' ainsi que l'un des délégués fournis dans les nombreuses solutions. Linq peut être excessif si votre tableau est grand, car il peut vous obliger à en faire une copie si vous voulez le conserver sous forme de tableau ou de liste (via 'ToList()' ou 'ToArray()'). –

Répondre

6

LINQ to la rescousse!

planSolutionsList = planSolutions 
    .OrderBy(x => x.id) 
    .ThenBy(x => x.Name) 
    .ToList(); // is this necessary? 

Pour le format original - vous voulez juste votre comparateur d'établir des priorités ID sur le nom

planSolutionsList.Sort((x, y) => 
{ 
    //HELP lol 
    if (x.id != y.id) return x.id - y.id; 
    else return x.Name.CompareTo(y.Name); 
}); 
0

Pour une approche linguistique-acnostic: Est-ce que chacun dans l'ordre.

1) Trier au niveau. 2) Rappelez-vous les emplacements de départ de chaque niveau après le tri 3) répétez l'opération pour le prochain tri des critères, en ne triant que les sous-sections.

1

vous pouvez utiliser LINQ

planSolutionsList.OrderBy(x => x.Level).ThenBy(x => x.Name).ToList(); 
0
planSolutionsList.Sort(delegate(PlanSolution x, PlanSolution y) { 
    if (x.Level == x.Level) {   // same level, compare by name 
     return x.Name.CompareTo(y.Name); 
    } else {        // different level, compare by level 
     return x.Level.CompareTo(y.Level); 
    } 
    });