Ceci est une extension de la réponse brillante de BigJim .
Dans mon cas, j'avais une NodeBase
classe avec un Children
dictionnaire, et j'avais besoin d'un moyen de faire des recherches génériques O (1) à partir des enfants. J'essayais de renvoyer un champ de dictionnaire privé dans le getter de Children
, donc évidemment je voulais éviter une copie / itération coûteuse. Par conséquent, j'ai utilisé le code de Bigjim pour convertir le Dictionary<whatever specific type>
en un générique Dictionary<NodeBase>
:
// Abstract parent class
public abstract class NodeBase
{
public abstract IDictionary<string, NodeBase> Children { get; }
...
}
// Implementing child class
public class RealNode : NodeBase
{
private Dictionary<string, RealNode> containedNodes;
public override IDictionary<string, NodeBase> Children
{
// Using a modification of Bigjim's code to cast the Dictionary:
return new IDictionary<string, NodeBase>().CastDictionary<string, RealNode, NodeBase>();
}
...
}
Cela a bien fonctionné. Cependant, j'ai finalement rencontré des limitations indépendantes et j'ai fini par créer une FindChild()
méthode abstraite dans la classe de base qui ferait les recherches à la place. Il s'est avéré que cela a éliminé le besoin du dictionnaire coulé en premier lieu. (J'ai pu le remplacer par un simple IEnumerable
pour mes besoins.)
La question que vous pourriez vous poser (surtout si les performances sont un problème qui vous interdit d'utiliser .Cast<>
ou .ConvertAll<>
) est:
"Ai-je vraiment besoin de convertir toute la collection, ou puis-je utiliser une méthode abstraite pour détenir les connaissances spéciales nécessaires pour effectuer la tâche et éviter ainsi d'accéder directement à la collection?"
Parfois, la solution la plus simple est la meilleure.