Tri d'une liste et de tous ses objets imbriqués à l'aide de LINQ
C'est une organisation avec plusieurs ministères et chaque département a un peu de salariés.
J'ai créé le modèle d'objet:
public class Organisation
{
public int Code { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public List<Department> Departments { get; set; }
}
public class Department
{
public int Code { get; set; }
public string Name { get; set; }
public List<Employee> Employees { get; set; }
}
public class Employee
{
public int Code { get; set; }
public string Name { get; set; }
}
Maintenant, j'ai une liste de ces organisations et l'utilisation de LINQ, je voudrais trier/commande de la sortie comme suit:
1) Organisations: Commandé par le Code et le Nom
2) Départements: Commandé par le Code et le Nom
3) Employés: Commandé par le Code et le Nom
Ci-dessous quelques données de test que j'ai remplis:
var britishTelecomLtd = new Organisation
{
Code = 8,
Name = "British Telecom Ltd",
Type = "Institutional",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Finance",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Accounts",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
}
}
};
var virginMediaLtd = new Organisation
{
Code = 5,
Name = "Virgin Media Ltd",
Type = "Institutional",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Sales",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Support",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
}
}
};
var pcWorldLtd = new Organisation
{
Code = 18,
Name = "PC World Ltd",
Type = "Retail",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Marketing",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
},
new Department
{
Code = 5,
Name = "Customer Services",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Kelly"
},
new Employee
{
Code = 2,
Name = "Jenny"
},
new Employee
{
Code = 6,
Name = "Tricia"
}
}
}
}
};
var blueCatLtd = new Organisation
{
Code = 3,
Name = "Blue Cat Music Ltd",
Type = "Retail",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Sales",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Warehouse",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Andy"
},
new Employee
{
Code = 2,
Name = "Robert"
},
new Employee
{
Code = 6,
Name = "Dave"
}
}
}
}
};
var organisations = new List<Organisation>
{
britishTelecomLtd,
virginMediaLtd,
pcWorldLtd,
blueCatLtd
};
Ici, je suis l'ajout de données à un dictionnaire:
var legalEntitiesCollectionByType = new Dictionary<string, ICollection<Organisation>>
{
{
"Institutional", organisations
.Where(x => x.Type == "Institutional")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.ToList()
},
{
"Retail", organisations
.Where(x => x.Type == "Retail")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.ToList()
}
};
de le faire de cette façon, le tri n'arrive qu'au niveau de l'Organisation et non sur le ministère ou l'employé.
Ma question est, comment puis-je obtenir le tri sur 3 niveaux dans la hiérarchie de l'objet pendant le remplissage du dictionnaire ci-dessus?
Acclamations
Si elle doit se produire dans cette méthode, puis vous avez besoin de recréer chaque objet et de trier les éléments en faisant cela. Par exemple:
.OrderBy(x => x.Code).ThenBy(x => x.Name).Select(o => new Organisation() { //populate with data from o, using OrderBy when needed });
. Toutefois, vous devriez reconsidérer votre conception.peux pas le faire. Le client a besoin d'une triés dictionnaire.
Je vais essayer votre suggestion.
OriginalL'auteur haroonxml | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Que vous devez faire tous les trois niveaux de tri à l'intérieur les objets que vous de retour, comme ça (je vais vous montrer seulement la
"Retail"
, le"Institutional"
doit être triés de la même manière):Car vous avez besoin de sélectionner plusieurs fois, vous pouvez envelopper ce code dans une méthode, et de l'utiliser à partir de plusieurs endroits, comme ceci:
OriginalL'auteur dasblinkenlight
Je sais que c'est une vieille question, mais il y a un moyen plus simple d'atteindre le même résultat:
Merci pour la faute de frappe. Comme pour l' .ToList() je ne pense pas que c'est vraiment nécessaire. Je vais vérifier et vous laisser savoir.
OriginalL'auteur Hellraiser
Si
Employees
jamais besoin d'être triés par code et nom, puis vous pouvez faire de cette propriété unSortedList<>
.Avant .NET 4 vous pouvez utiliser
KeyValuePair
au lieu deTuple
.Lors de la création de
Employees
objet, vous aurez besoin de fournirIComparer
objet pour triés clé de la liste.où
EmployeeKeyComparer
pourrait être défini commesi la liste est toujours nécessaire pour être triés puis il est logique de sorte qu'une seule fois, plutôt que de trier avec linq chaque fois qu'il est utilisé.
OriginalL'auteur Dialecticus
Vous pouvez trier avant :
Et ensuite utiliser la liste déjà triée
NB : le tri n'est pas en place, vous pouvez le faire en utilisant un
comparer
Parce que 'orderby' n'a pas de commande "à la place", il génère un nouveau IEnumerable et j'ai besoin de lui attribuer. "Trier" la méthode, au contraire, fait le travail "à la place de".
Ces gars-là sont même autre chose stackoverflow.com/questions/3378603/linq-orderby-vs-icomparer
OriginalL'auteur Toto
OriginalL'auteur Paulo Sérgio Vieira