2017-07-09 10 views
0

乱数を生成し、パーセンテージに基づいてオプションを選択する必要があるコードがたくさんあります。私は単純にメルセンヌ・ツイスターの実装を使用し、0から100までの倍数を生成し、選択されたケースで結果をパーセンテージで割り当てることで問題なく動作します。それはうまく動作しますが、それは非常に面倒であり、真実が言われる、私は毎回これを絶えず書いてうんざりしています。 「1-10」5は1〜10の間にあるので、: VB.netのEXCELルックアップに似た関数を実装する

は私がずっとあなたがこのような場合には戻ってくるように LOOKUP(5, {1,10,20,30,40}, {"1-10", "11-20", "21-30","31-40"})

として二つの配列を与えるEXCELのルックアップ機能に似たものを好みます。

LINQを使用してC#/ VB.Netバージョンを実装する簡単な方法はありますか?私はそこにいるはずだと確信していますが、私はこのようなものを実装する方法を失っています。この1行のコードは、長いselect case文よりもはるかに簡単です。 EXCEL・ルックアップ機能と同等のものを実装するより良い方法がある場合は

は、私が...にもあることを知ってみたい

答えて

0

私のように、あなたは、ルックアップの第二の形をしていると仮定しています最初の引数が2番目の引数で渡された配列の要素と正確に一致しない場合、最初にエラーをスローします。

これは動作するはずです:

​​

使用法:

Dim Result as string = LOOKUP(5, {1,10,20,30,40}, {"1-10", "11-20", "21-30","31-40"}) 
0

ありLINQまたは配列/リスト.FindIndexでそれを行うにはいくつかの方法がありますが、整数の除算はおそらく最高です。

Dim d = 10.1, a = {1, 10, 20, 30, 40}, b = {"1-10", "11-20", "21-30", "31-40"} 

Dim s1 = b(a.Count(Function(i) i <= d) - 1) 

Dim s2 = b(Array.FindLastIndex(a, Function(i) i <= d)) 

Dim s3 = $"{d - d Mod 10 + 1}-{d - d Mod 10 + 10}"  ' "11-20" 
+0

これは、整数が使用されている場合の1%で有効です。次のような倍数を使用した場合の99%のケースではどうなりますか:{1.5675、6.54534、9.87812、32.87899、88.3434,100.1}?私は、「ワンケース」のシナリオに合うように何かを設計することはほとんどありません。私がデザインするものはすべて、すべてのケースで動作する必要があります。 – MattE

+0

@MattEたとえば、10〜11または1未満の値の結果に応じて、必要に応じて調整することができます。また、最初の2は1または40以上の値で失敗します。 – Slai

+0

正直なところ私は思います私の実装ははるかに簡単で使いやすくなっています... – MattE

0

私は実際に@Alexander Higginsと似たようなものが出てきましたそれについては数分です。私はそうのようにそれを呼び出す:

CaseLookup({41, 59, 80, 101}, {"Balanced", "PowerBack", "Receiving", "OneCut"}, 0, 100) 

は基本的に私は、それがその範囲内に入ることを意味する、より少ない最初のインデックスを見つけるために、次の項目とループのための境界を設定します。次に、検索配列から同じインデックスを単に値として取ります。

Public Shared Function CaseLookup(numArray As Array, lookupArray As Array, minVal As Double, maxval As Double) As String 
     Dim result As String = "" 
     Dim GetNum As Double = MT.GenerateDouble(minVal, maxval) 

     If numArray.Length <> lookupArray.Length Then 'Checks to make sure the arrays are the same length 
      Throw New Exception("numArray and lookupArray MUST be the same length!") 
      Exit Function 
     End If 

     For i = 0 To numArray.Length - 1 
      If GetNum < numArray(i) Then result = lookupArray(i).ToString() 
     Next i 
     Return result 
    End Function 
関連する問題