List Remove【偏移量和长度超出数组的界限,或者计数大于从索引到源集合结尾处的元素数量】

wanglz666 2013-03-27 07:44:37
最近在使用WPF架构进行项目开发。遇到一个有关List操作的问题。
出问题的代码如下:
try
{
foreach (var item in itemsToRemove)
this.items.Remove(item);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
items被声明为ObservableCollection<ISelectable>类型
(ISelectable为声明的接口)
其中,items是被绑定到一个ScrollViewer的ItemsSource上。该代码意图从items中删除
选中的一项或者多项。

如果从items中删除一项,则执行正确;但如果尝试删除两项或以上,则会出现如题的错误。
错误调试截图如下:



可以看到,itemsToRemove中只有两项,而items中有三项。
为何会报越界的错误呢?
这与绑定是否有关?

Any help will be appreciated.
...全文
458 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iceMung 2013-03-28
  • 打赏
  • 举报
回复
itemsToRemove中的数据怎么绑定的?
xiaogui340 2013-03-28
  • 打赏
  • 举报
回复
删除两项的时候,在第一个循环报错么
菜牛 2013-03-28
  • 打赏
  • 举报
回复
因为你删除的是列表控件里面的项,删除一个没问题,可是已经改变了列表项的索引,删除第二个的时候,原来保存的列表索引没变,但是可能已经超出真实的列表项的范围了。
wanglz666 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 Mackz 的回复:
这种情况要“从后往前删”。
确实,实验之后发现,只能从后往前删除,并且是依次单个删除。 这样便不会报错。 可是这是什么原因呢? 该如何解决呢? 从StackTrace看来,错误应是出在画布(即显示items的地方)重新布局时,似乎与绑定有关。
iceMung 2013-03-28
  • 打赏
  • 举报
回复
用你的方法我简单测试了下,貌似是可以的
List<Student> items = new List<Student>();
            items.Add(new Student("张三", 18));
            items.Add(new Student("李四", 20));
            items.Add(new Student("王五", 21));
            items.Add(new Student("赵六", 19));

            List<Student> itemsCopy = items.Where(x => x.age > 19).ToList();

            foreach (var item in itemsCopy)
            {
                items.Remove(item);
            }
wanglz666 2013-03-28
  • 打赏
  • 举报
回复
引用 3 楼 iceMung 的回复:
itemsToRemove中的数据怎么绑定的?
itemsToRemove = this.items.Where(x => x.IsSelect).ToList() itemsToRemove仅仅是items中一部分元素的copy,并不绑定到UI
wanglz666 2013-03-28
  • 打赏
  • 举报
回复
引用 3 楼 iceMung 的回复:
itemsToRemove中的数据怎么绑定的?
不是 当删除两个或以上的items时,都仅仅是在删除最后一个时报错
wanglz666 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 Mackz 的回复:
这种情况要“从后往前删”。
为什么呢? 链表的操作没有这种限制啊~
菜牛 2013-03-27
  • 打赏
  • 举报
回复
这种情况要“从后往前删”。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧