O 'LINQ-fuマスター、お手上げです。結果カウントが式の条件で使用されるLINQステートメント
VB.NETでTarget.AddRange()を使用してIEnumerable(Of T)からList(Of T)(これをTargetと呼ぶ)にアイテムを追加する必要がある。
Target.AddRange(Source.TakeWhie(Function(X, Index) ?))
?部分は、次のようなトリッキーな状態です:まだ列挙されていない数がリストを最小限にするのに必要なものと等しくない場合は、現在の項目を取るべきかどうかをランダムに決定します。 Somethigのような...
Source.Count() - Index = _minimum_required - _curr_count_of_items_taken _
OrElse GetRandomNumberBetween1And100() <= _probability_this_item_is_taken
' _minimum_required and _probability_this_item_is_taken are constants
交絡部分は_curr_count_of_items_takenがTakeWhile文が満足されるたびにインクリメントする必要があるということです。それをどうやってやりますか?
私はTakeWhileではなく、他のLINQメソッド(集計、場所など)を使用するソリューションにもオープンしています。
すべてが他の後、私は戻ってforループ古き良きを使用することになります失敗した場合=)
しかし、LINQのソリューションがあることを望ん。事前に感謝の意を表します。
EDIT:
Dim _source_total As Integer = Source.Count()
For _index As Integer = 0 To _source_total - 1
If _source_total - _index = MinimumRows - Target.Count _
OrElse NumberGenerator.GetRandomNumberBetween1And100 <= _possibility_item_is_taken Then
Target.Add(Source(_index))
End If
Next
EDITDIT:要求されたとして、古き良きforループバージョン ダビデの無副作用の答えが読める滞在しながら、私は必要なものに閉じています。たぶん彼は私の疎通した擬似コード=を理解できる唯一の人です。 OrderBy(GetRandomNumber)は後天的に見事です。 Take(3)の部分をTake(MinimumRequiredPlusAnOptionalRandomAmountExtra)に変更し、最後にOrderByとSelectを削除するだけです。残りのおかげで提案に感謝します。
私はあなたの要件を理解できないので、私はかなり混乱した答えを削除しました。あなたの質問にwhileループバージョンを書くことは可能でしょうか?明確な出発点がありますか? –