У меня есть коллекция IDictionary<string, MyEnum?>
, которую необходимо передать в класс, чтобы обернуть ее в IReadOnlyDictionary<string, MyEnum>
(примечание MyEnum
, но не MyEnum?
).Конструкция класса для свойств только для чтения
Я пришел с двумя конструкциями:
Задержка обертка для
IReadOnlyDictionary<string, MyEnum>
до доступа к свойству:public class MyClass { private readonly IEnumerable<KeyValuePair<string, MyEnum?>> _kvps; public MyClass(IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { _kvps = kvps; } public IReadOnlyDictionary<string, MyEnum> Kvps { get { var filtered = from kvp in _kvps where kvp.Value.HasValue select kvp; return new ReadOnlyDictionary<string, MyEnum>( filtered.ToDictionary(kvp => kvp.Key, kvp => (MyEnum)kvp.Value); } } }
Жадно оценить коллекцию в конструкторе
public class MyClass { public MyClass(IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { Kvps = ToReadOnly(kvps); } public IReadOnlyDictionary<string, MyEnum> Kvps { get; } private static IReadOnlyDictionary<string, MyEnum> ToReadOnly( IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { var filtered = from kvp in kvps where kvp.Value.HasValue select kvp; return new ReadOnlyDictionary<string, MyEnum>( filtered.ToDictionary(kvp => kvp.Key, kvp => (MyEnum)kvp.Value); } }
В разделе «Руководства по проектированию рамок» constructor design предполагается, что минимальная работа должна быть выполнена в конструкторах, поэтому я выбираю первый подход. Тем не менее, это означает, что каждый звонок до MyClass.Kvps
вызовет копию _kvps
, которая не является идеальной.
Я хотел бы знать, что является лучшим подходом (или есть другие способы) с точки зрения:
- эффективность памяти (в идеале только один экземпляр коллекции хранится в
MyClass
) - Производительность (доступ к собственности должно быть быстрым и не должен вызывать копию
KeyValuePair
с)
Ваши два проекта имеют разные типы поведения, если исходный словарь изменен между конструкцией и доступом к свойствам или между последовательными доступами свойств. Какой ты хочешь? – Blorgbeard
@Blorgbeard Я бы хотел, чтобы свойство всегда отображало последние значения из источника 'IDictionary'. Означает ли это, что я ограничу только своим первым подходом? – rexcfnghk
Тогда да, вам нужно будет сделать фильтрацию в аксессуре свойств. – Blorgbeard