Problème :
Vous disposez d'une liste d'objets avec une propriété contenant des numéros de facture dans un format de chaîne spécifique, par exemple, 200906/1. Le tri par défaut de Linq OrderBy en C# entraîne un ordre de tri indésirable, tel que 200906/1, 200906/10, 200906/11.
Solution :
À implémentez votre propre ordre de tri personnalisé, vous pouvez définir un IComparer
public class MyComparer : IComparer<Object> { public int Compare(Object stringA, Object stringB) { string[] valueA = stringA.ToString().Split('/'); string[] valueB = stringB.ToString().Split('/'); if (valueA.Length != 2 || valueB.Length != 2) { return stringA.ToString().CompareTo(stringB.ToString()); } // Parse numbers for comparison int numA = int.Parse(valueA[0]); int numB = int.Parse(valueB[0]); if (numA == numB) { return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1])); } else { return numA.CompareTo(numB); } } }
Dans votre code d'origine, vous avez tenté d'utiliser votre MyComparer dans Linq OrderBy comme suit :
items = items.OrderByDescending( x => property.GetValue(x), comparer).ToList();
Cette approche est incorrecte. La syntaxe correcte pour utiliser votre comparateur est :
items = items.OrderBy(x => property.GetValue(x), comparer).ToList();
Notez que la méthode OrderBy est utilisée à la place de OrderByDescending si vous souhaitez trier par ordre croissant.
Enfin, n'oubliez pas de réattribuez les éléments triés à votre source de données pour refléter les modifications apportées à votre interface utilisateur :
this.Items = items;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!