2

因此,两者都ListBox.ObjectCollection实现ListView.ListViewItemCollectionIList类,它提供了AddRemove方法,但没有AddRange, InsertRange, 或RemoveRange。但是,ListBox.ObjectCollectionListView.ListViewItemCollection提供了一种AddRange方法——只是 noInsertRangeRemoveRange.

ArrayList另一方面,查看类,它在实现之上IList还提供AddRangeInsertRangeRemoveRange。此类和接口的通用形式List<T>(具有AddRangeInsertRangeRemoveRange)和IList<T>(仅提供AddRemove)之间存在相同的区别。

我可以理解不提供的IList和接口等等——它只是一个接口;超出, ,等最低要求的任何内容都是可选的。但是,考虑到和类的方法的有用性,并考虑到它们对和控件的方便程度,我想知道为什么这些控件不存在它们。IList<T>AddRangeAddRemoveRemoveAt*RangeArrayListList<T>ListBoxListView

有人知道吗?和 的内部实现是否有某些东西InsertRange使这些方法在某种程度上不那么有效,更复杂,或者在其他方面不太RemoveRange适合ListBox.ObjectCollectionand ?ListView.ListViewItemCollectionAddRange

需要明确的是:我不是在寻找关于“看起来微软的某个人变得懒惰”的猜测;相反,我想知道是否有人真正知道AddRangeand InsertRange/之间的合法区别,这可能解释andRemoveRange中缺少后一种方法。ListBox.ObjectCollectionListView.ListViewItemCollection

4

1 回答 1

1
  1. 一般来说,使用 InsertRange 和(甚至更多)RemoveRange 是一个非常罕见的场景。例如,RemoveRange 是否应该仅在存在与给定范围相似的连续元素范围时才删除给定范围,还是应该逐个删除给定元素?

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

  3. 代码中没有任何迹象,表明实现这些方法会很复杂(就像数以千计的其他“有用”方法一样)。实际上, even 的ListView实现InsertItems需要一个已经在引擎盖下的项目数组。只是标准ListViewItemCollection.Insert()总是为数组提供 1 个元素。用反射器看一下ListViewNativeItemCollection.Insert()

     public ListViewItem Insert(int index, ListViewItem item)
     {
         //Various checks excluded ....
         this.owner.InsertItems(index, new ListViewItem[] { item }, true);
         //More code excluded .....
         return item;
     }
    

我想实现该功能并不是那么重要……所以他们没有。

正如 Eric Lippert喜欢说的那样:“因为没有人设计、指定、实施、测试、记录和发布该功能”。

于 2009-09-29T17:24:36.590 回答