【发布时间】:2010-03-05 19:05:12
【问题描述】:
我想创建一个IList<Child>,它始终以默认/隐式排序顺序维护其Child 对象(即,无论对基础列表的添加/删除如何)。
我特别想避免的是,上述IList<Child> 的所有消费者每次想要枚举它时都需要显式调用IEnumerable<T>.OrderBy()。除了违反 DRY 之外,这种方法还会破坏封装,因为消费者必须知道我的列表甚至是排序的,这真的不关他们的事:)
似乎最合乎逻辑/最有效的解决方案是将IList<Child> 公开为IEnumerable<Child>(以防止列表突变)并将显式添加/删除方法添加到包含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)
【问题讨论】:
标签: linq ienumerable natural-sort