Это расширение для блестящего ответа 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:
«Нужно ли мне вообще использовать всю коллекцию, или я могу использовать абстрактный метод для хранения специальных знаний, необходимых для выполнения задачи, и тем самым избежать прямого доступа к коллекции?»
Иногда самое простое решение - лучшее.
Проще всего было бы использовать dplyr::bind_rows
library(dplyr)
bind_rows(lst(df1,df2,df3),.id="newCol")
# newCol X1 X2
# 1 df1 1 1
# 2 df1 1 1
# 3 df2 2 2
# 4 df2 2 2
# 5 df3 3 3
# 6 df3 3 3
tibble::lst()
, как показано здесь , доbind_rows()
, чтобы вместо фактического имени вместо имен указывать фактические имена? – aosmith 13 July 2018 в 15:19