W języku C# instrukcja switch
nie zezwala na przypadki obejmujące zakresy wartości. Nie podoba mi się pomysł wykorzystania pętli if-else do tego celu, więc czy istnieją inne sposoby sprawdzania zakresów liczbowych w C#?Przełączanie obudowy, sprawdzanie zasięgów w języku C# 3.5
Odpowiedz
można użyć HashTable
odpowiednio Dictionary
stworzyć odwzorowanie Condition => Action
.
przykład:
class Programm
{
static void Main()
{
var myNum = 12;
var cases = new Dictionary<Func<int, bool>, Action>
{
{ x => x < 3 , () => Console.WriteLine("Smaller than 3") } ,
{ x => x < 30 , () => Console.WriteLine("Smaller than 30") } ,
{ x => x < 300 , () => Console.WriteLine("Smaller than 300") }
};
cases.First(kvp => kvp.Key(myNum)).Value();
}
}
Ta technika jest ogólnie alternatywę switch
, zwłaszcza działania składa się tylko z jednej linii (jak połączenia metody).
A jeśli jesteś fanem typu aliasów:
using Int32Condition = System.Collections.Generic.Dictionary<System.Func<System.Int32, System.Boolean>, System.Action>;
...
var cases = new Int32Condition()
{
{ x => x < 3 , () => Console.WriteLine("Smaller than 3") } ,
{ x => x < 30 , () => Console.WriteLine("Smaller than 30") } ,
{ x => x < 300 , () => Console.WriteLine("Smaller than 300") }
};
+1 za fajny pomysł – Alex
Ale nie powinieneś brać słownika (weź listę KeyValuePair, Tuple lub sth self defined) inaczej nie możesz przewidzieć w jakiej kolejności wywoływane są Funki do testowania. – Oliver
Interesujące, ale gdybym zobaczył ten wzorzec jako zamiennik if/else w prawdziwym projekcie, przesyłam go na http://thedailywtf.com :) – Stilgar
Nie. Oczywiście, jeśli zakresy są małe, można zastosować podejście zbliżone, ale inne niż: nie. Użyj if
/else
.
Nie. Co najmniej nic, co jest piękniejsze.
Również nie ma C# 3.5 tylko .NET 3.5 i C# 3.0
jeśli przerwa zakresów jest stały, można spróbować
int num = 11;
int range = (num - 1)/10; //here interval is 10
switch (range)
{
case 0:
Console.Write("1-10");
break; // 1-10
case 1:
Console.Write("11-20");
break; // 11-20
// etc...
}
wyjściowy będzie: "11-20"
jeśli przerwa jest zmienna następnie użyć if/else
spróbować czegoś jak ten
private void ExecuteInRange(Dictionary<Range,Action<int>> ranges)
{
foreach (var range in ranges)
{
if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max)
range.Value(range.Key.Value);
}
}
public class Range
{
public int Min { get; set; }
public int Max { get; set; }
public int Value { get; set; }
}
pewnego rodzaju skrót zagnieżdżonego-if-else rzeczą działa i jest czysty.
myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0;
jakikolwiek powód obniżenia wersji? Przekręciłem 20 linii kodu na 1. – blomster
To jest przerażające. – ediblecode
int b;
b = Int32.Parse(textBox1.Text);
int ans = (100-b)/3; //the 3 represents the interval
//100 represents the last number
switch(ans)
{
case 0:
MessageBox.Show("98 to 100");
break;
case 1:
MessageBox.Show("95 to 97");
break;
case 2:
MessageBox.Show("92 to 94");
break;
case 3:
MessageBox.Show("89 to 91");
break;
case 4:
MessageBox.Show("86 to 88");
break;
default:
MessageBox.Show("out of range");
break;
Jak duży jest zakresy? – leppie
Naprawdę nie można tego zrobić w języku C# (chyba że jest to mały zakres liczb, które można wyświetlać w blokach), ale na raz ** można ** w VB.Net - http://stackoverflow.com/questions/1009902/select-case-to-check-range-of-a-decimal-number funnily – dash
Cóż, możesz mieć metodę zwracającą bool, która przyjmuje zakres, a następnie, jeśli pętle, jest prosta, czytelna i działa dobrze – V4Vendetta