Fait intéressant, si vous énumérer sur le dictionnaire (longueur N) d'abord et vérifiez la liste (longueur M) pour l'inclusion, puis vous obtenez des performances O (NM).
Vous pouvez créer un HashSet<>
des ID, mais cela semble redondant puisque nous avons déjà un dictionnaire (pré-haché) disponible.
Je voudrais plutôt itérer sur les identifiants d'abord; puisque la recherche par dictionnaire (par clé) est O (1), cela donne des performances O (M) - cela peut toutefois signifier que vous n'utilisez pas LINQ (puisque TryGetValue
n'aimerait pas LINQ (et l'introduction d'un tuple est trop dur comme travail) ...
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids) {
var result = new Dictionary<string, string>();
string value;
foreach (string key in ids) {
if (salesPersons.TryGetValue(key, out value)) {
result.Add(key, value);
}
}
return result;
}
il ne pas trop me regarde que ce soit plus de lignes que la version LINQ, il supprime un O (N) de complexité ...
Edit, le pourrait travailler (je ne l'ai pas testé), mais je pense que c'est un abus de LINQ, et certainement pas à l'échelle de PLINQ etc ... utiliser avec une extrême prudence !! Je crois aussi l'approche foreach
a simplement moins de frais généraux, donc sera plus rapide ... de toute façon:
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids)
{
string value = null;
return (from key in ids
where salesPersons.TryGetValue(key, out value) // HACK: v. dodgy
select new { key, value })
.ToDictionary(x=>x.key, x=>x.value);
}
Voir ma réponse pour les notes de performance ... –
+1, Marc, bien que je pense que si vous êtes inquiet au sujet de cette perf genre de chose que vous avez beaucoup trop en mémoire comme il est! :) –
@Matt ... bien, peut-être - mais il y a un point où O (1)/O (N * log (N)) * n'est pas * déraisonnable, mais O (N^2) * est * un * problème - que ce soit 1k, 10k ou 100k est à la hauteur du processus spécifique, bien sûr. –