Laden...

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

Erstellt von Programmierhans vor 6 Jahren Letzter Beitrag vor 6 Jahren 7.598 Views
Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 6 Jahren
Generische ExtensionMethode zum prüfen ob sich Wert innerhalb/ausserhalb/auf der Grenze befindet

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

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 6 Jahren

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.

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 6 Jahren

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...

L
5 Beiträge seit 2014
vor 6 Jahren

Hallo Programmierhans,

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

danke sagt Luschi
aus klein-Paris