O 'LINQ-fu masters, aidez-nous s'il vous plaît.Instruction LINQ où le nombre de résultats est utilisé dans l'état de l'expression
J'ai une exigence où je dois ajouter des éléments dans une liste (Of T) (appelons-la cible) à partir d'un IEnumerable (Of T) (appelons-le Source) en utilisant Target.AddRange() dans VB.NET .
Target.AddRange(Source.TakeWhie(Function(X, Index) ?))
Le? La partie est une condition délicate qui est quelque chose comme: Tant que le nombre non encore énuméré n'est pas égal à ce qui est nécessaire pour remplir la liste au minimum requis, décidez aléatoirement si l'élément actuel doit être pris, sinon prenez l'élément. somethig comme ...
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
La partie confondant est que _curr_count_of_items_taken doit être incrémentée chaque fois que l'instruction TakeWhile est satisfaite. Comment ferais-je cela?
Je suis également ouvert à une solution qui utilise toutes les autres méthodes LINQ (Aggregate, Where, etc.) au lieu de TakeWhile.
Si tout le reste échoue alors je vais revenir à l'aide d'un bon vieux pour boucle =)
Mais en espérant qu'il y est une solution LINQ. Merci d'avance pour toute suggestion.
EDIT: Bon vieux pour la version en boucle comme demandé:
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: David vient de sans effets secondaires réponse ferme à ce que je besoin tout en restant lisible. Peut-être qu'il est le seul à pouvoir comprendre mon pseudo-code mal communiqué =). Le OrderBy (GetRandomNumber) est brillant avec le recul. J'ai juste besoin de changer la partie Take (3) en Take (MinimumRequiredPlusAnOptionalRandomAmountExtra) et laisser tomber OrderBy et Select à la fin. Merci au reste pour des suggestions.
J'ai supprimé ma réponse plutôt confuse parce que je ne peux pas comprendre votre exigence. Serait-il possible pour vous d'écrire la version while-loop dans votre question, donc nous avons un point de départ clair? –