Gibt es eine std::less<T> Gegenstück



  • Hallo,

    kann man sowas machen wie bei std::less in C++
    also:

    class Test<T>
    {
    ....
       public bool IsLess(T rhs)
       {
          return myT < rhs;
       }
    
       T myT;
    }
    

    oder hab liegt das über den Möglichkeiten der .NET generics?



  • 'IComparer<T>'

    /EDIT: bzw. 'Comparer<T>.Default'.



  • Ich nehme die Antwort mal als ein Nein.
    Meine Frage war ja ob man sowas implementieren kann.
    Mit dem Kleiner operator. Aber da man kein entsprechendes Constraint forumlieren kann darf man auch den kleiner operator nicht anwenden.



  • templäd schrieb:

    Ich nehme die Antwort mal als ein Nein.

    Dann hast Du's falsch verstanden, die Antwort lautete „ja“: 'std::less' heißt unter .NET halt 'Comparer<T>.Default' und einen eigenen kann man schreiben, indem man das 'IComparer<T>'-Interface implementiert.

    Aber da man kein entsprechendes Constraint forumlieren kann darf man auch den kleiner operator nicht anwenden.

    Wenn Du es constraintbasiert machen willst, dann kannst Du als Constraint auch einfach 'IComparable<T>' angeben, das ist aber weniger flexibel. Zwei Beispiele (ungetestet, habe gerade keine VM am laufen):

    // Constraintbasiert:
    T min<T>(T a, T b) where T : IComparable<T> {
        return a.CompareTo(b) <= 0 ? a : b;
    }
    
    var x = min(1, 2);
    var s = min("Hallo", "Welt");
    
    // Per Comparer
    T min<T>(T a, T b, IComparer<T> comparer) {
        return comparer.Compare(a, b) <= 0 ? a : b;
    }
    
    T min<T>(T a, T b) {
        return min(a, b, Comparer<T>.Default);
    }
    
    // Aufruf:
    var x = min(1, 2);
    var s = min("Hallo", "Welt", StringComparer.InvariantCultureIgnoreCase);
    

Anmelden zum Antworten