为什么ListBox.ObjectCollection和ListView.ListViewItemCollection具有AddRange但不具有InsertRange或RemoveRange?

时间:2009-09-28 18:27:05

标签: .net list listview listbox ilist

因此,ListBox.ObjectCollectionListView.ListViewItemCollection都会实施IList类,该类提供AddRemove方法,但不提供AddRange,{{ 1}}或InsertRange。但是,RemoveRangeListBox.ObjectCollection也提供了ListView.ListViewItemCollection方法 - 只有AddRangeInsertRange

另一方面,请查看RemoveRange课程,除了实施ArrayList之外,还提供IListAddRangeInsertRange。此类和接口的通用形式RemoveRange(包含List<T>AddRangeInsertRange)和RemoveRange(仅限于此类)提供IList<T>Add)。

我可以理解RemoveIList接口没有提供IList<T>等等 - 它只是一个接口;超出AddRangeAddRemove等最低要求的任何内容都是可选的。但是,考虑到RemoveAt*Range类的ArrayList方法的有用性,并考虑到List<T>ListBox控件的方便性,我想知道为什么他们不存在这些控制。

有谁知道吗? ListViewInsertRange的内部实施是否存在一些问题,使得这些方法在某种程度上不如RemoveRangeListBox.ObjectCollection更有效,更复杂或更不适合ListView.ListViewItemCollectionAddRangeAddRange

要明确:我不是在寻找“看起来像微软的某个人变得懒惰”的猜测。相反,我想知道是否有人知道<{1}}和InsertRange / RemoveRange之间的合法差异可能解释了{ {1}}和ListBox.ObjectCollection

1 个答案:

答案 0 :(得分:1)

  1. 一般情况下,使用InsertRange和(甚至更多)RemoveRange是一种非常罕见的情况。例如,RemoveRange应该仅在存在与给定范围类似的连续范围的元素时删除给定范围,还是应该逐个删除给定元素?

  2. 如果您需要,这些方法通常很容易实现。借助扩展方法,您可以使它们看起来几乎像本机方法。

  3. 代码中没有任何迹象表明实现这些方法会很复杂(就像成千上万的其他“有用”方法一样)。实际上,ListView的{​​{1}}实现甚至需要一个数组项目已经在幕后。只是标准InsertItems总是为数组提供1个元素。使用Reflector查看ListViewItemCollection.Insert()

    ListViewNativeItemCollection.Insert()
  4. 我认为实现该功能并不重要......所以他们没有。

    正如Eric Lippert likes to say:“因为没有人设计,指定,实施,测试,记录和发送该功能”。