none
用户输入一段文字在textbox上,点击按钮,后台绑定获取该字符串,然后调用方法判断Obser<T>数据集合的每个实体对象的字符串属性是否包含该字符串。运行时,ListView上仍显示一些不符合If判断结果的对象。如何较好地解决? RRS feed

  • 问题

  • 用户输入一段文字在textbox上,点击按钮,后台绑定获取该字符串,然后调用方法判断Obser<T>数据集合的每个实体对象的字符串属性是否包含该字符串,该功能就是就是用户输入关键字,并根据关键字检索,筛选ListView绑定的数据集合中包含该关键字的数据。运行使用时,ListView上仍显示一些不符合If判断结果的对象,也就是有些不包含用户输入的关键字的字符串属性的实体对象,任然没被移除掉,还残留在集合中。如何较好地解决?

    首先我已经使用了contain函数,同时也使用了正则表达式判断是否包含字符串,无论是输入纯中文,还是输入纯英文。每次筛选都有一些不符合if判断结果的实体对象没被移除掉,还在集合中。仍然在listview中显示。我在控制台程序中使用ObservableCollection<string>测试一下,是不是集合本身有毛病。但控制台显示的结果筛选很好。没有不符合判断结果的对象出现。但是在我的wpf项目中就是这样。是bug吗?

    for (int i = 0; i < sreach.Count; i++) //sreach是ObservableCollection<T>类型,containStr获取用户输入的字符串变量,用于判断是否包含该字符串
                {
                    if (Regex.IsMatch(sreach[i].FileName, containStr) == false)
                    {
                        sreach.Remove(sreach[i]);
                    }
                }

    我目前找到的解决办法就是在for循环外面加个循环,数据量小的话该层循环多循环几次,数据量大的话循环几十次以上,ListView才会显示全部只符合if判断结果的实体对象。除了这个有没有较好的办法?




    2016年12月29日 5:34

答案

  • sreach.Remove(sreach[i]);

    这里是有问题的,你删除了一项,sreach元素项的个数会减少(for循环次数),这样会减少循环的次数,导致一些数据没有被过滤删除。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年12月29日 6:07

全部回复

  • sreach.Remove(sreach[i]);

    这里是有问题的,你删除了一项,sreach元素项的个数会减少(for循环次数),这样会减少循环的次数,导致一些数据没有被过滤删除。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年12月29日 6:07
  • 首先,我们不去判断remove的对错。

    你所要做是事是取出集合中符合要求的项,所以,这里应该进行一次拷贝操作。将符合要求的项取出。尽量不去操作原始的列表。

    其次,对集合进行遍历remvoe要倒序.

    2016年12月29日 11:49