Это расширение для блестящего ответа BigJim .
В моем случае у меня был класс NodeBase
со словарем Children
, и мне нужен был способ в целом сделать O (1) поиск от детей. Я пытался вернуть частное поле слова в getter из Children
, поэтому, очевидно, я хотел избежать дорогостоящего копирования / итерации. Поэтому я использовал код Bigjim, чтобы передать Dictionary
в общий Dictionary
:
// Abstract parent class
public abstract class NodeBase
{
public abstract IDictionary Children { get; }
...
}
// Implementing child class
public class RealNode : NodeBase
{
private Dictionary containedNodes;
public override IDictionary Children
{
// Using a modification of Bigjim's code to cast the Dictionary:
return new IDictionary().CastDictionary();
}
...
}
. Это сработало хорошо. Тем не менее, я в конечном итоге столкнулся с несвязанными ограничениями и в итоге создал абстрактный метод FindChild()
в базовом классе, который вместо этого выполнял бы поиск. Как оказалось, это устранило потребность в литом словаре в первую очередь. (Я смог заменить его простым IEnumerable
для моих целей.)
Итак, вопрос, который вы можете задать (особенно если производительность - это проблема, запрещающая вам использовать .Cast<>
или .ConvertAll<>
), is:
«Нужно ли мне вообще использовать всю коллекцию, или я могу использовать абстрактный метод для хранения специальных знаний, необходимых для выполнения задачи, и тем самым избежать прямого доступа к коллекции?»
Иногда самое простое решение - лучшее.
В инструкциях на https://github.com/z3t0/Arduino-IRremote написано (акцент мой):
Установка
blockquote>
- Перейдите на страницу «Релизы».
- Загрузите последнюю версию.
- Извлеките zip-файл
- Переместите папку «IRremote», которая была извлечена, в каталог ваших библиотек .
- Обязательно удалите Arduino_Root / library / RobotIRremote. Где Arduino_Root ссылается на каталог установки Arduino. Библиотека RobotIRremote имеет схожие определения с IRremote и вызывает ошибки.
Этот жирный бит совершенно расплывчатый и может относиться ко многим различным местам. Описание в приведенной ниже строке хорошо описывает, где на самом деле находится «каталог библиотек», но описание не в той строке, где это необходимо.
Я думаю, что когда они говорят
blockquote>
- Переместите папку «IRremote», которая была извлечена в каталог вашей библиотеки.
они на самом деле означают
blockquote>
- Переместить папку «IRremote», которая была извлечена, в Arduino_Root / library / IRremote, где Arduino_Root ссылается на каталог установки Arduino .