Trong C#, câu lệnh switch
không cho phép các trường hợp mở rộng phạm vi giá trị. Tôi không thích ý tưởng sử dụng các vòng if-else cho mục đích này, vậy có cách nào khác để kiểm tra các dãy số trong C# không?Trường hợp chuyển đổi, phạm vi kiểm tra trong C# 3.5
Trả lời
Bạn có thể sử dụng HashTable
tương ứng Dictionary
để tạo ánh xạ Condition => Action
.
Ví dụ:
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();
}
}
Kỹ thuật này là một thay thế chung để switch
, đặc biệt là nếu những hành động bao gồm duy nhất của một dòng (giống như một lời gọi phương thức).
Và nếu bạn là một fan hâm mộ của loại bí danh:
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 cho ý tưởng hay – Alex
Nhưng bạn không nên dùng từ điển (lấy danh sách KeyValuePair, Tuple hoặc sth self) nếu không bạn không thể dự đoán thứ tự Func được gọi để kiểm tra. – Oliver
Thú vị nhưng nếu tôi thấy mô hình này như là một sự thay thế nếu/người nào khác trong dự án thực tôi đang gửi nó đến http://thedailywtf.com :) – Stilgar
Không. Tất nhiên, nếu phạm vi nhỏ, bạn có thể sử dụng phương thức
case 4:
case 5:
case 6:
// blah
break;
, nhưng khác hơn là: không. Sử dụng if
/else
.
Không. Ít nhất là không có gì đẹp hơn.
Cũng không có C# 3.5 chỉ .NET 3.5 và C# 3.0
nếu khoảng thời gian của dãy là hằng số, bạn có thể thử
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...
}
Output sẽ là: "11-20"
nếu khoảng thời gian là biến sau đó sử dụng if/else
Hãy thử một cái gì đó như thế này
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; }
}
Một loại lồng nhau là cách gọi tắt if-else điều hoạt động, và là sạch.
myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0;
bất kỳ lý do gì để hạ cấp? Tôi đã biến 20 dòng mã thành 1. – blomster
Điều đó thật khủng khiếp. – 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;
- 1. Kiểm tra phạm vi trong trường hợp của Haskell?
- 2. Chuyển đổi phần mở rộng phạm vi trường hợp GNU tiêu chuẩn C
- 3. PHP Phạm vi Ngày Kiểm tra
- 4. Junit kiểm tra phạm vi biến lớp
- 5. F # Kiểm tra arithmetics Phạm vi
- 6. tuyên bố chuyển đổi mà không vi phạm
- 7. php chuyển đổi trường hợp tuyên bố để xử lý phạm vi
- 8. Kiểm tra nếu một phạm vi ngày trong một phạm vi ngày
- 9. Chuyển đổi tập hợp các số nguyên thành các phạm vi bằng cách sử dụng C#
- 10. Kiểm tra xem một số nguyên nằm trong phạm vi
- 11. Ngày kiểm tra dựa vào phạm vi ngày trong Python
- 12. Kiểm tra vi phạm android: minSdkVersion tự động
- 13. Log4j trong trường hợp kiểm tra JUnit
- 14. Phạm vi phủ sóng Cobertura cho các bài kiểm tra tích hợp trong Maven
- 15. Phạm vi biến trong C++
- 16. Kiểm tra phạm vi số với cụm từ thông dụng
- 17. Trường hợp chuyển đổi C/C++ trên mảng char
- 18. Phạm vi nguyên mẫu mùa xuân - Trường hợp sử dụng?
- 19. Mysql truy vấn với phạm vi, và trường hợp tệ
- 20. Cách kiểm tra xem một Phạm vi Excel có trống trong C#
- 21. Chuyển đổi bộ số nguyên thành phạm vi
- 22. Khi chuyển đổi dự án để sử dụng ARC, "trường hợp chuyển đổi nằm trong phạm vi được bảo vệ" nghĩa là gì?
- 23. vector ngoài phạm vi/dải ô kiểm tra
- 24. Đường ray 3.1.3 phạm vi chưa được kiểm tra
- 25. Kiểm tra đối tượng vi phạm mục tiêu
- 26. Kiểm tra phạm vi đường ray cho nil
- 27. Chuyển đổi/Định lượng Phạm vi Phao thành Dải số
- 28. C# phạm vi câu hỏi
- 29. Có sử dụng phạm vi thập phân trong một chuyển đổi không thể trong C#?
- 30. Sự nhầm lẫn phạm vi biến đổi trong C#
Phạm vi lớn bao nhiêu? – leppie
Bạn không thể thực sự làm điều đó trong C# (trừ khi đó là một phạm vi nhỏ các số bạn có thể liệt kê trong các khối), nhưng, một lần, bạn ** có thể ** trong VB.Net - http://stackoverflow.com/questions/1009902/select-case-to-check-range-of-a-số thập phân funnily đủ – dash
Vâng, bạn có thể có một phương pháp trở lại bool mà mất trong phạm vi và sau đó nếu vòng, đơn giản, dễ đọc và làm việc tốt – V4Vendetta