Je travaille dans C# 2.0 .Net. J'ai une classe, disons X avec beaucoup de propriétés. Chaque propriété a un attribut personnalisé, un interger, que j'ai prévu d'utiliser pour spécifier son ordre dans le tableau final. Utilisation de la réflexion J'examine toutes les propriétés et regroupe les valeurs et les place dans une liste générique de propriétés. Cela fonctionne et je peux saisir les valeurs. Mais le plan était TRIER la liste, basé sur l'attribut personnalisé placé sur chaque propriété, et finalement lire les valeurs de propriété, déjà commandées, dans une chaîne.Comment trier une liste générique en fonction d'un attribut personnalisé?
5
A
Répondre
11
Disons que vous aviez la définition d'attribut suivant
public class SortAttribute : Attribute {
public int Order { get; set; }
public SortAttribute(int order) { Order = order; }
}
Vous pouvez utiliser le code ci-dessous pour retirer les propriétés sur un type dans l'ordre. En supposant bien sûr, ils ont tous cet attribut
public IEnumerable<object> GetPropertiesSorted(object obj) {
Type type = obj.GetType();
List<KeyValuePair<object,int>> list = new List<KeyValuePair<object,int>>();
foreach (PropertyInfo info in type.GetProperties()) {
object value = info.GetValue(obj,null);
SortAttribute sort = (SortAttribute)Attribute.GetCustomAttribute(x, typeof(SortAttribute), false);
list.Add(new KeyValuePair<object,int>(value,sort.Order));
}
list.Sort(delegate (KeyValuePair<object,int> left, KeyValuePair<object,int> right) { left.Value.CompareTo right.Value; });
List<object> retList = new List<object>();
foreach (var item in list) {
retList.Add(item.Key);
}
return retList;
}
LINQ style Solution
public IEnumerable<string> GetPropertiesSorted(object obj) {
var type = obj.GetType();
return type
.GetProperties()
.Select(x => new {
Value = x.GetValue(obj,null),
Attribute = (SortAttribute)Attribute.GetCustomAttribute(x, typeof(SortAttribute), false) })
.OrderBy(x => x.Attribute.Order)
.Select(x => x.Value)
.Cast<string>();
}
Questions connexes
- 1. Trier la liste générique
- 2. Comment faire pour trier une liste de manière générique
- 3. Trier la liste générique basée sur une liste différente
- 4. Comment faire une liste générique égale une autre liste générique
- 5. Comment trier une liste en C#?
- 6. Comment trier une liste liée en SQL?
- 7. Comment trier la liste générique Asc ou Desc?
- 8. Comment cloner une liste générique en Java?
- 9. Comment puis-je trier la liste générique avec Linq?
- 10. Création d'une fonction de tri pour une liste générique
- 11. Comment retourner une liste générique?
- 12. trier une liste des pourcentages
- 13. Attribut personnalisé .NET WebService
- 14. Comment extraire un objet personnalisé d'une liste générique avec LINQ?
- 15. Trier Liste générique sur deux ou plusieurs valeurs
- 16. Trier la liste par propriété/fonction anonyme?
- 17. Schéma trier une liste
- 18. Comment trier un XDocument par attribut?
- 19. Trier une liste de classe avec LINQ
- 20. Comment trier une liste de chaînes?
- 21. Comment trier la collection par attribut created_at
- 22. liste Trier en utilisant la fonction de tri STL
- 23. Comment trier une liste dans Jinja2?
- 24. Comment trier une liste chaînée dans hql?
- 25. comment trier cette liste?
- 26. Trier une liste des instances de la classe Python
- 27. Optimiser la fonction pour trier une liste de tuples
- 28. Trier une liste avec qsort?
- 29. Comment trier une liste d'objets Django python?
- 30. Comment trier une liste déroulante ASp.net MVC?
Votre réponse fonctionne pour C# 3 + et Wich LINQ est pas disponible dans le cadre 2.0 – Argons
@Argons, lu à droite après le 2.0 restriction. Mettra à jour – JaredPar
Si je veux obtenir seulement des attributs avec l'attribut de tri? Et le code ne manque-t-il pas la validation qu'il n'y a pas deux propriétés avec le même ordre? – gdoron