Quelque chose comme ceci devrait suffire :
IEnumerable<string, int> pairsToRemove = dictionary.Where(pair => pair.Value == 0);
Pour générer un index aléatoire, vous pouvez utiliser :
int indexToRemove = [RandomNumber] % pairsToRemove.Length() -1;
Trouver l'élément indexToRemove th dans pairsToRemove et le supprimer du dictionnaire.
En ce qui concerne l'efficacité : La complexité devrait être O(n) [obtenir tous les éléments de valeur 0] + O(.6N) [trouver la ième valeur à supprimer] + O(log(n)) [suppression] en supposant que la génération de nombres aléatoires se fasse en temps constant.
Le problème est qu'il n'existe aucun moyen d'effectuer une recherche de valeur dans un dictionnaire en un temps supérieur à O(n). C'est donc là que se situe votre goulot d'étranglement.