Maison >développement back-end >C++ >Comment trier correctement une liste à l'aide d'un IComparer personnalisé avec Linq OrderBy ?

Comment trier correctement une liste à l'aide d'un IComparer personnalisé avec Linq OrderBy ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-01 04:11:10342parcourir

How to Correctly Sort a List Using a Custom IComparer with Linq OrderBy?

Utilisation d'IComparer avec Linq OrderBy

Problème

Vous avez une liste générique où MyClass contient une propriété InvoiceNumber avec des valeurs telles que 200906/1. Vous souhaitez utiliser un IComparer pour trier la liste dans un ordre spécifique. Cependant, lorsque vous utilisez votre comparateur personnalisé, la liste est toujours mal triée.

Réponse

Il y a deux problèmes dans votre code :

  1. Le comparateur personnalisé que vous avez fourni ne trie pas correctement les nombres. Vous devez convertir les valeurs InvoiceNumber en nombres et trier en fonction de ces nombres.
  2. Vous ne mettez pas à jour la BindingList avec les éléments triés. Après avoir trié la liste, vous devez attribuer la liste triée à la propriété Items de BindingList.

Voici le comparateur personnalisé corrigé :

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 String.Compare(stringA.ToString(), stringB.ToString());
        }

        // Note: do error checking and consider i18n issues too :)
        if (valueA[0] == valueB[0]) {
          return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1]));
        } else {
          return int.Parse(valueA[0]).CompareTo(int.Parse(valueB[0]));
        }
    }

}

Et ici est le code corrigé pour mettre à jour BindingList :

case ListSortDirection.Ascending:
    MyComparer comparer = new MyComparer();
    items = items.OrderByDescending(x => property.GetValue(x), comparer).ToList();
    break;
default:
    // Handle descending sort direction here
    break;
}

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn