Feedback

VB - Fluent IsBetween extension method

Veröffentlicht von am 6/27/2015
(0 Bewertungen)
This snippet offers an extension method for fluent "is between" comparison for integers. You can simply replace integer by any other numeric type, making it generic would make it not being a snippet anymore.

An example to use this extension method:

int x = 3;
if(x.IsBetween(0).And(5))
'x is between 0 and 5!
Imports System.Runtime.CompilerServices

Public Module ComparisonExtensions

    ''' <summary>Call .And() on the result!</summary>
    <Extension()> _
    Public Function IsBetween(value As Integer, minimum As Integer) As AndHelper
        Return New AndHelper() With { _
                .[And] = Function(maximum) (value > minimum) AndAlso (value < maximum)}
    End Function
End Module

Public NotInheritable Class AndHelper
    Public [And] As Func(Of Integer, Boolean)
End Class

Abgelegt unter Fluent, Is, Between, Extension, Method.

6 Kommentare zum Snippet

Koopakiller schrieb am 6/28/2015:
Auf einer deutschen Seite wäre eine deutsche Beschreibung vermutlich besser geeignet. Ansonsten: http://dotnet-snippets.com

Was ich nur nicht verstehe ist, warum man es sich so kompliziert machen muss. Ich schrieb auch mal eine "IsBetween" Methode, die aber min und max entgegen nimmt.
Thomas Roskop schrieb am 6/29/2015:
Ja, ich hätte es auch eher anders gemacht:


//
// Überrpüft, ob @value größer als @min aber kleiner als @max ist.
//
public static bool IsInRangeE(int min, int max, int value) {
return (value > min && value < max);
}

//
// Überrpüft, ob @value größer-gleich als @min aber kleiner-gleich als @max ist.
//
public static bool IsInRangeI(int min, int max, int value) {
return (value >= min && value <= max);
}

Veluxe schrieb am 7/1/2015:
Nichts anderes wird ja bei diesem fluent wrapper verwendet:
(value > minimum) && (value < maximum)

Es steht ja auch extra im Titel Fluent, da die Anwendung der Funktion im Quellcode fließend lesbar ist.
Koopakiller schrieb am 7/1/2015:
Trotzdem ist es unnütze Arbeit. Deine Lösung basiert darauf eine weitere Klasse zu instanziieren etc., was alles relativ viel Leistung braucht.
Wenn du etwas fließend lesbares haben willst, dann baue dir so etwas auf:
static bool IsInALine(int min, int value, int max){...}

Nur so etwas wirst du 1. nur sehr selten in .NET finden und 2.: einfacher zu lesen ist es auch nicht wirklich.

Veluxe schrieb am 7/1/2015:
Ob das unnütz ist könnte man philosopieren, gibt genügend Fluent APIs die so etwas anbieten. Da steht primär nunmal nicht die Performance an erster Stelle, sondern Lesbarkeit. LINQ instanziiert auch neue Klassen etc. und man könnte es anders machen, das ist aber für mich kein Argument es anders lösen zu müssen. Es gibt bei stackoverflow einen Thread da werden genau solche Methoden ausgetauscht. Also die Putzfrau sagte mir mit ihren bescheidenen Englischkentnissen, dass sie x.IsBetween(0).And(5) verstanden hat, bei IsBetween(x, 0, 5) konnte sie mir nicht sagen was nun Minimum und Maximum sind.
Koopakiller schrieb am 7/1/2015:
Man muss immer abwägen zwischen Leistungsverschwendung und vielleicht besserem Programmierstil. LINQ kann kaum effizienter sein, zumal das EF beispielsweise nochmals im Hintergrund optimiert. Deine Lösung ist jedoch aus Leistungssicht schlicht ineffizient und würde sich besser machen lassen.
Auch geht es nicht darum ob die Putzfrau es lesen kann, sondern ob sie selbst darauf kommen würde es so zu schreiben, wenn sie bisher nur die IsBetween(x,y,z) Syntax kennt - wie es fast das gesamte .NET verwendet. Denn sonst bringt es ihr nichts.

Du kannst den Code gerne so verwenden, aber erfahrungsgemäß sind die, die so etwas schreiben oder verwenden auch die die sich über die Ausführungsgeschwindigkeit beklagen.
 

Logge dich ein, um hier zu kommentieren!