Heim > Backend-Entwicklung > C++ > Wie sortiere ich eine Liste mit einem benutzerdefinierten IComparer mit Linq OrderBy richtig?

Wie sortiere ich eine Liste mit einem benutzerdefinierten IComparer mit Linq OrderBy richtig?

Linda Hamilton
Freigeben: 2025-01-01 04:11:10
Original
327 Leute haben es durchsucht

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

Benutzerdefinierten IComparer verwenden mit Linq OrderBy

Problem

Sie haben eine generische List Dabei enthält MyClass eine InvoiceNumber-Eigenschaft mit Werten wie 200906/1. Sie möchten einen benutzerdefinierten IComparer verwenden. um die Liste in einer bestimmten Reihenfolge zu sortieren. Wenn Sie jedoch Ihren benutzerdefinierten Vergleich verwenden, ist die Liste immer noch falsch sortiert.

Antwort

Es gibt zwei Probleme in Ihrem Code:

  1. Der von Ihnen bereitgestellte benutzerdefinierte Vergleicher sortiert die Zahlen nicht richtig. Sie sollten die InvoiceNumber-Werte in Zahlen umwandeln und basierend auf diesen Zahlen sortieren.
  2. Sie aktualisieren die BindingList nicht. mit den sortierten Artikeln. Nachdem Sie die Liste sortiert haben, müssen Sie die sortierte Liste der Items-Eigenschaft der BindingList zuweisen.

Hier ist der korrigierte benutzerdefinierte Vergleicher:

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]));
        }
    }

}
Nach dem Login kopieren

Und hier ist der korrigierte Code zum Aktualisieren der 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;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie sortiere ich eine Liste mit einem benutzerdefinierten IComparer mit Linq OrderBy richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage