我想创建一个始终以默认/隐式排序顺序IList<Child>
维护其Child
对象(即,无论对基础列表的添加/删除)。
我特别想避免的是,所有的消费者都需要在每次想要枚举它时IList<Child>
显式调用。IEnumerable<T>.OrderBy()
除了违反 DRY 之外,这种方法还会破坏封装,因为消费者必须知道我的列表甚至是排序的,这真的不关他们的事:)
似乎最合乎逻辑/最有效的解决方案是公开IList<Child>
为IEnumerable<Child>
(以防止 List 突变)并将显式 Add/Remove 方法添加到包含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
(在这种情况下,底层是驱动排序的属性)。对于这样一个基本问题,肯定有更优雅的解决方案,但我一直找不到。
编辑: 我不清楚我是否更喜欢 LINQ 兼容的解决方案。我宁愿不使用 .NET 2.0 构造(即 SortedList)