Это продолжение блестящего ответа BigJim .
В моем случае у меня был NodeBase
класс со Children
словарем, и мне нужен был способ сделать O (1) общий поиск от детей. Я пытался вернуть поле частного словаря в получателе Children
, поэтому, очевидно, я хотел избежать дорогостоящего копирования / итерации. Поэтому я использовал код Bigjim, чтобы кастовали Dictionary<whatever specific type>
к родовому 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>();
}
...
}
Это сработало хорошо. Однако в итоге я столкнулся с несвязанными ограничениями и в итоге создал абстрактный FindChild()
метод в базовом классе, который вместо этого будет выполнять поиск. Как оказалось, это устранило необходимость в приведенном словаре в первую очередь. (Я смог заменить его на простой IEnumerable
для моих целей.)
Таким образом, вопрос, который вы можете задать (особенно если производительность - это проблема, запрещающая вам использовать .Cast<>
или .ConvertAll<>
):
«Мне действительно нужно разыграть всю коллекцию, или я могу использовать абстрактный метод для хранения специальных знаний, необходимых для выполнения задачи, и, таким образом, избежать прямого доступа к коллекции?»
Иногда самое простое решение - лучшее.