2010-10-29 8 views
2

Quel serait le moyen le plus rapide pour trier une liste qui contient une liste d'objets, basée sur une autre liste? Un exemple suit:Trier la liste générique basée sur une liste différente

Dites que j'ai plusieurs listes d'employés. Chaque liste individuelle a une valeur de propriété commune, par exemple "Département". J'ai donc une liste d'employés, dans une liste ils ont tous la valeur de chaîne de département "Ventes". Dans une autre liste, tous les objets ont une valeur de département "Finance". Ces listes d'employés sont ensuite contenues dans une liste qui les contient toutes.

J'ai une deuxième liste, qui devrait conduire l'ordre de tri des listes d'employés. La deuxième liste contient simplement une liste de chaînes telles que "Finance", "Ventes", "IT" et ainsi de suite. Je voudrais mes listes de clients à trier dans l'ordre de « Finance », « ventes », etc.

J'utilise VB.NET dans .NET 2.0

Cheers!

Répondre

1

EDIT: Désolé, n'a pas remarqué que vous avez mentionné VB.

C'est n'est pas la façon la plus efficace, mais voici une façon de le faire:

List<List<Employee>> employeeLists = ... 
List<string> departments = ... 

// implicitly List<List<Employee>> 
var sortedEmpLists = employeeLists 
        .OrderBy(eList => departments.IndexOf(eList.First().Department)) 
        .ToList(); 

Essentiellement, l'idée est de déclarer qu'une sous-liste de l'ordre des employés dépend de l'ordre de son premier département de membre. Bien sûr, cela dépend des hypothèses suivantes, qui, selon moi, sont vraies dans votre scénario:

  1. Tous les employés d'une sous-liste appartiennent au même département.
  2. Toutes les sous-listes d'employés contiennent au moins un employé.
  3. Tous les services mentionnés dans les listes d'employés sont présents dans la liste departments.

Si vous voulez un en place tri:

employeeLists.Sort((eList1, eList2) => 
        departments.IndexOf(eList1.First().Department) 
          .CompareTo(departments.IndexOf(eList2.First().Department))); 

EDIT: Voici une version .NET 2.0 (C#):

Comparison<List<Employee>> comp = 
          delegate(List<Employee> eList1, List<Employee> eList2) 
          { 
           string d1 = departments.IndexOf(eList1[0].Department); 
           string d2 = departments.IndexOf(eList2[0].Department); 
           return d1.CompareTo(d2);           
          }; 
employeeLists.Sort(comp); 

Bien sûr, vous pouvez toujours écrire un IComparer<List<Employee>> aussi.

+0

Je ne peux pas utiliser LINQ dans .NET 2.0 –

+0

@ Ek0nomik: Edited. Désolé, je ne connais pas VB.NET, donc je ne peux pas fournir le code * exact * dont vous avez besoin. – Ani