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...
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.
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...
Hallo Programmierhans,
habe gerade diese interessante Extension unter Nutzung von enum erfolgreich implementiert.
danke sagt Luschi
aus klein-Paris