Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Generische ExtensionMethode zum prüfen ob sich Wert innerhalb/ausserhalb/auf der Grenze befindet
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

Themenstarter:

Generische ExtensionMethode zum prüfen ob sich Wert innerhalb/ausserhalb/auf der Grenze befindet

beantworten | zitieren | melden

RangeCheck-Extension für IComparable:

Eine kurze generische ExtensionMethode um zu prüfen ob sich ein Wert innerhalb / ausserhalb oder auf der Grenze befindet.



    public static class Extensions
    {
        public static RangeCheck IsInRange<T>(this T pValue, T pBorder1, T pBorder2) where T: IComparable
        {
            return (RangeCheck)(Math.Sign(pBorder1.CompareTo(pBorder2)) == 0 ? 
                Math.Abs(Math.Sign(pValue.CompareTo(pBorder1))) + 1 : 
                Math.Abs(Math.Sign(pValue.CompareTo(pBorder1)) + Math.Sign(pValue.CompareTo(pBorder2))));
        }
    }



    public enum RangeCheck
    {
        Inside = 0,
        Border = 1,
        Outside = 2
    }


TestCode:

        private void Test()
        {

            int border1 = 3;
            int border2 = 7;

            System.Diagnostics.Debug.WriteLine("RealBorder (3-7)");

            for (int value = 1; value < 10; value++)
            {
                System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
            }


            border1 = 5;
            border2 = 5;

            System.Diagnostics.Debug.WriteLine("EqualBorder (5)");

            for (int value = 1; value < 10; value++)
            {
                System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
            }
        }
    }



Ausgabe:

RealBorder 3-7
1=Outside
2=Outside
3=Border
4=Inside
5=Inside
6=Inside
7=Border
8=Outside
9=Outside

EqualBorder (5)
1=Outside
2=Outside
3=Outside
4=Outside
5=Border
6=Outside
7=Outside
8=Outside
9=Outside


Edit: herbivore hat natürlich Recht... (Math.Sign eingebaut)


Range Check IComparable Extension
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Programmierhans am .
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Programmierhans,

eine IComparable.CompareTo-Methode ist nicht dazu verpflichtet, nur die Werte -1, 0 oder 1 zu liefert, sondern kann beliebige Integer-Werte liefert. Das kommt praktisch auch durchaus vor, sogar bei Klassen aus dem .NET-Framework(*). Du kannst die Rückgabewerte also nicht einfach so addieren, sondern müsstest vorher noch Math.Sign darauf anwenden.

herbivore

(*) Das sieht man [in der ursprünglichen Version ohne Math.Sign] zum Beispiel, wenn man in deinem Testcode überall int durch short ersetzt.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore

Danke für den Hinweis.
Habe ich sofort angepasst.

Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
Luschi
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: klein-Paris

beantworten | zitieren | melden

Hallo Programmierhans,

habe gerade diese interessante Extension unter Nutzung von enum erfolgreich implementiert.

danke sagt Luschi
aus klein-Paris
private Nachricht | Beiträge des Benutzers