2010-12-15 8 views
0

Benutze ich das ist die richtige Art und Weise? Soweit ich es verstehe, sollte die folgende Überprüfung falsch sein:C# Using Enumerable.Range()

int myVal = 37; 
if (Enumerable.Range(0, 10).Contains(myVal)) 
    // Do something 
else if (Enumerable.Range(11, 33).Contains(myVal)) 
    // Do somethiong else 

Aber ich scheine einige Fälle zu bekommen, wo //Do somethiong else ausgeführt wird. Kann ich nicht verwenden Enumerable.Range ist so?

Antwort

17

Die Signatur für liefert einen Anhaltspunkt:

public static IEnumerable<int> Range(
    int start, 
    int count 
) 

Der erste Parameter aufgerufen wird beginnen; die zweite heißt count. So gibt Ihr zweiter Aufruf 33 Werte beginnend mit 11 zurück, die 37 enthalten.

+0

gut zu wissen, aber ich frage mich, wie viele Menschen, dass intuitiv denken! Ich wünsche, dass die Parameter der IMO offensichtlicher verwendet werden. – Chad

+1

@Chad: OK, nehmen wir an, wir haben es so gemacht. Wie stellen Sie (1) einen leeren Bereich dar, (2) einen Bereich, der als letztes Element Int32.MaxValue hat? –

+0

@Eric: Fair genug für einen leeren Bereich (wie wäre es mit Enumerable.Empty wie String.Empty?), Aber konnte nicht einfach Enumerable.Range (0, Int32.MaxValue) tun, um das letzte Element Int32.MaxValue in sein die (Start, Ende) Version? – Chad

10

Wenn dieses besondere Beispiel, ist es ineffizient, eine Aufzählung auf diese Weise einfach zu erstellen, um zu überprüfen, dass ein Wert in einem bestimmten Bereich liegt. if (x < y) ist wahrscheinlich besser.

+0

+1: Auch sehr wahr. –

+2

O (n) gegen O (1), brrr. –

1

Es wird in jedem Wert zur Folge geprüft wird, und ist ein wenig verwirrend, tun, warum nicht:

int myVal = 37; 
if (myVal >= 0 && myVal <= 10) 
    // Do something 
else if (myVal <= 33) 
    // Do somethiong else 
Verwandte Themen