2012-09-05 28 views
11

Tôi muốn hỏi một người có kỹ năng mạnh hơn tôi trong C#.Có thể xác định thứ gì đó giống như 'between' trong câu lệnh if-else trong C#?

Có thể giảm đoạn mã sau

if(val > 20 && val < 40) 
... 
else 
if(val > 40 && val < 72) 
... 
else 
if(val > 72 && val < 88) 
... 
else 
... 

Giả sử rằng tôi có hơn 10-11 if-else báo cáo.

Cách tốt nhất để rút ngắn mã ở trên là gì?

Tôi đã nghĩ đến điều gì đó như between trong sql.

+0

bạn đang làm những việc hoàn toàn khác nhau trong mỗi khối mã? Bạn có thể có một danh sách/mảng với 20,40,72, vv miễn là khối mã có thể giống nhau nhưng với chỉ mục của nhóm nào trong đó. – Servy

+0

Có thể trong VB nhưng với kiến ​​thức của tôi không có trong C#. – Magnus

+0

@Magnus Để công bằng, bạn có thể tạo một cú pháp dựa trên thư viện trong cú pháp khớp với cú pháp 'Chọn Case' trong VB trong sự đồng nhất (nhưng có, không tồn tại trong khung công tác). –

Trả lời

28

Xác định một extension method:

public static bool Between(this int source, int a, int b) 
{ 
    return source > a && source < b; 
} 

Sau đó, sử dụng nó:

if (val.Between(20, 40)) 
//... 

Như oɔɯǝɹ một cách chính xác chỉ ra trong bình luận của mình, bạn có thể đi một bước xa hơn và hỗ trợ tất cả người triển khai của IComparable<T> với phương pháp mở rộng chung:

public static bool Between<T>(this T source, T a, T b) where T : IComparable<T> 
{ 
    return source.CompareTo(a) > 0 && source.CompareTo(b) < 0; 
} 
+12

bạn có thể biến nó thành một phương thức mở rộng chung: 'public static bool Between (nguồn T, T a, T b): trong đó T: IComparable ' –

+0

* xuất sắc * gợi ý! – Adam

-1
if(val > 72) 
{ 

} 
else 
{ 
    if(val > 40) 
    { 
    ... 
    } 
    else 
    { 
    ... 
    } 
} 
4

Một cách thay thế để làm điều đó là để lưu trữ các dãy của bạn trong Danh sách và sử dụng chức năng Có để tìm hiểu xem val là trong phạm vi, nhưng không có thêm thông tin có vẻ như bạn có nó càng ngắn càng bạn có thể làm nó.

1

Bạn có thể thực hiện điều này, nhưng sẽ nhiều, nếu không phải gõ nhiều hơn để gọi nó. Trong trường hợp này, nếu bạn thực sự muốn gì between không, sau đó bạn sẽ được thêm súc tích với:

if(val >= 20 && val <= 88) 
{ 
    if(val <= 40) 
    ... 
    else if(val <= 72) 
    ... 
} 
else 
... 

Lưu ý rằng tôi đang sử dụng <=>= để phù hợp với giữa hành vi. Tuy nhiên, tôi giả sử rằng bạn không muốn có hai việc được thực hiện cho các giá trị chính xác 40, chính xác 72 và cũng không có gì được thực hiện (trong câu hỏi của bạn, không có gì sẽ được thực hiện).

0
class Range{ public int first; public int second} 

list<Range> rangeList= new list<Range> 

ghi tất cả các kết hợp trong danh sách với lớp

foreach(Range objRange in rangeList) 
{ 
if(val>objRange.first && val<objRange.last) 
{...... 
break; 
} 
} 
+0

@snake mắt thử cách tiếp cận này của tôi quá có thể nó sẽ ngắn mã của bạn theo cách tiêu chuẩn –

+0

Bạn thực sự cần phải làm việc trên Class của bạn/tên biến ... Nó sẽ * đáng kể * cải thiện khả năng đọc mã của bạn. – Servy

+0

@Servy pls đề xuất khái niệm là rht hay không tôi đã chỉnh sửa để đặt tên –

1

Theo tôi đó là tốt để có bộ sưu tập của dãy. Và nếu logic bên trong khối khá giống nhau, bạn có thể lưu trữ một đại biểu được liên kết với phạm vi này.

RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42)); 
if(range != null) 
{ 
    dynamic result = range.SomeDelegate.DynamicInvoke(); 
} 

đâu RangeBase là một trừu tượng đơn giản:

public abstract class RangeBase 
{ 
    public int MinValue { get; private set; } 
    public int MaxValue { get; private set; } 

    public abstract Delegate SomeDelegate { get; } 

    protected RangeBase(int minValue, int maxValue) 
    { 
     MinValue = minValue; 
     MaxValue = maxValue; 
    } 

    public bool BelongsToRange(int number) 
    { 
     return number > MinValue && number < MaxValue; 
    } 
} 
+1

Giống như tất cả các chương trình, điều này thực sự là một thương mại ra giữa nơi bạn đang đặt nỗ lực của bạn. Tôi thích giải pháp, nhưng cuối cùng nó là đủ công việc mà bạn có lẽ sẽ không lưu bất kỳ thời gian thực thế nào cho dự án hiện tại này. Tuy nhiên, ông là một giải pháp tuyệt vời nếu bạn thấy mình yêu cầu loại điều này trong nhiều dự án, trong trường hợp này bạn muốn đặt các cơ sở trừu tượng vào một thư viện mà bạn sử dụng với tất cả các dự án trong tương lai. – Stuporman

Các vấn đề liên quan