12

C#で私よりも強いスキルを持っている人に聞いてみたいです。

次のコードを減らすことは可能ですか?

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

if-else私が10-11以上のステートメントを持っていると仮定しましょう。

上記のコードを短縮するための最良の方法は何ですか?

betweenはSQLのようなもので考えました。

4

6 に答える 6

29

拡張メソッドを定義します:

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

次に、それを使用します。

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

oɔɯǝɹが彼のコメントで正しく指摘しているように、さらに一歩進んIComparable<T>で、一般的な拡張メソッドでのすべての実装者をサポートすることができます。

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;
}
于 2012-09-05T19:15:55.850 に答える
4

これを行う別の方法は、範囲をListに格納し、Contains関数を使用して、valが範囲内にあるかどうかを確認することですが、詳細情報がないと、可能な限り短くなっているように見えます。

于 2012-09-05T19:21:47.280 に答える
1

私の意見では、範囲のコレクションがあるのは良いことです。また、ブロック内のロジックが非常に似ている場合は、この範囲に関連付けられたデリゲートを格納できます。

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

RangeBaseが単純な抽象化である場合:

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;
    }
}
于 2012-09-05T20:10:51.527 に答える
1

間を行うことはできますが、それを呼び出すために入力する必要がない場合でも、同じくらいの量になります。この場合、本当に何をするのかが必要な場合betweenは、次のように簡潔になります。

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

<=とを使用し>=て、動作間の動作を一致させていることに注意してください。ただし、値に対して2つのことを正確に実行したくない40、正確に実行したくない72、または何も実行したくないと想定しています(あなたの質問では、何も実行されません)。

于 2012-09-05T19:22:22.787 に答える
0
class Range{ public int first; public int second}

list<Range> rangeList= new list<Range>

クラスとリストにすべての組み合わせを書く

foreach( Range objRange in rangeList)
{
if( val>objRange.first && val<objRange.last)
{......
break;
}
}
于 2012-09-05T19:28:43.523 に答える
-1
if(val > 72)
{

}
else 
{
   if(val > 40)
   {
     ...
   }
   else
   {
     ...   
   }
}
于 2012-09-05T19:15:15.093 に答える