Рекс, ты, конечно, открыл интересную дискуссию, но, похоже, ты упустил все возможности - то есть ты, кажется, отвергаешь как (1) рекурсивную логику потребителя при записи и (2) раскрытие класса своего узла отношения более одного градуса.
Или, возможно, вы не полностью исключили (2). Я могу вспомнить еще один подход, который почти столь же выразителен, как метод (или свойство) GetDescendents, но, возможно, не настолько «тяжелый» (в зависимости от формы вашего дерева) ...
from item in AllItems where item.Parent == currentNode select item
и
from item in AllItems where item.Ancestors.Contains(currentNode) select item
Потому что у нее есть приятное свойство быть инволютивным , то есть ROT13 (ROT13 (alphaOnlyString)) = alphaOnlyString.
Согласно Википедии:
Сдвиг тринадцати был выбран по сравнению с другими значениями, такими как три, как в исходном шифре Цезаря, потому что тринадцать - это значение, для которого кодирование и декодирование эквивалентны, тем самым обеспечивая удобство использования одной команды для обоих.
Вероятно, потому что это его собственный инверс. Один и тот же алгоритм может использоваться как для «шифрования», так и для «дешифрования».
Потому что сдвиг на 13 перемещает символы наполовину по алфавиту (в котором 26 знаков). Итак, чтобы вернуться к обычному тексту, вам нужно всего лишь снова сдвинуть его на 13 ходов. Таким образом, вам не нужно иметь отдельные функции для кодирования или декодирования, потому что одна и та же операция будет кодироваться или декодироваться.