Я хотел бы создать IList<Child>
, который постоянно сохраняет свои объекты Child
в порядке/неявном порядке сортировки (т. Е. Вне зависимости от добавлений/абзацев в базовый список).IList с неявным порядком сортировки
То, что я специально пытаюсь избежать, - это необходимость для всех потребителей указанных IList<Child>
явно ссылаться на IEnumerable<T>.OrderBy()
каждый раз, когда они хотят его перечислить. Помимо нарушения DRY, такой подход также нарушит инкапсуляцию, так как потребители должны были бы знать, что мой список даже отсортирован, что на самом деле не является их бизнесом :)
Решение, которое показалось наиболее логичным/эффективным, заключалось в том, чтобы разоблачить IList<Child>
как IEnumerable<Child>
(для предотвращения мута List) и добавить явные методы добавления/удаления в содержащий Parent
. Таким образом, я могу перехватить изменения в список, которые требуют повторного рода, и применить один с помощью Linq:
public class Child {
public string StringProperty;
public int IntProperty;
}
public class Parent{
private IList<Child> _children = new List<Child>();
public IEnumerable<Child> Children{
get
{
return _children;
}
}
private void ReSortChildren(){
_children = new List<Child>(child.OrderBy(c=>c.StringProperty));
}
public void AddChild(Child c){
_children.Add();
ReSortChildren()
}
public void RemoveChild(Child c){
_children.Remove(c);
ReSortChildren()
}
}
Тем не менее, этот подход не перехватывают изменения, внесенные в базовых Child.StringProperty
(который в данном случае является собственность, управляющая сортировкой). Должно быть более элегантное решение такой основной проблемы, но я не смог ее найти.
EDIT: Я не был уверен, что предпочтительнее LINQ-совместимое решение. Я бы предпочел не прибегать к использованию конструкций .NET 2.0 (т. Е. SortedList)
Это не работает.Если вы измените значение ключа в базовом объекте, порядок сортировки не изменится. –