none
删除List<T>集合中不符合检索条件的元素 RRS feed

  • 问题

  • 各位老师,请教:

     

    1、集合是排序的,不符合条件的元素肯定在集合前部;2、集合元素特定属性长度短于输入的检索词长度,肯定是不符合检索条件的元素,需删除。

                       foreach (var item in acbList)   // 条件1
                        {
                            if (item.SerchString.Length < InputString.Length)   // 条件2
                            {
                                acbList.Remove(item);  // 将集合元素SerchString长度小于检索词的元素剔除
                            }
                            else
                                break;  // 条件2
                        }

    执行循环,第一趟可以,再次循环,出现如下错误:

    用户代码未处理InvalidOperationException
    集合已修改,可能无法执行枚举操作。

    听说过删除集合元素必须从后面进行,我也做过,确实可以。但这次条件要求必须从集合前部开始。麻烦各位老师过目,给出解决方法。

    先谢过了!


    ly_he

    2019年8月30日 1:57

答案

  • Hi,

    这方法确实比整体遍历来的高效。

    但是在使用以下代码之前已经可以正确过滤不符合的字符串了。

        acbList = acbList.FindAll(delegate(AutoCompleteModel de) { return de.SerchString.Substring(0, str.Length) == str; });

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年9月3日 2:10
    版主

全部回复

  • Hi ly_he,

    请参考下面的代码进行修改。

        foreach (var item in list.ToList())
        {
            if (item.SerchString.Length < InputString.Length)
            {
                list.Remove(item);
            }
        }

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年8月30日 5:15
    版主
  • 你好,王老师:

    首先,感谢您的回复和提供的方法。由于我的集合数据比较大,而且是排序的。根据这些特点,我现在用下面这段代码解决了这个问题。

      str = searchTextBox.Text;
                    int rangePt = 0;
                    if (str.Length>1)   // 条件1
                    {
                        for (int i = 0; i < acbList.Count; i++)
                        {
                            if (acbList[i].SerchString.Length < str.Length)
                                rangePt += 1;   // 条件3
                            else
                                break;
                        }
                        if (rangePt > 0)
                        {
                            acbList.RemoveRange(0, rangePt);    // 条件2
                        }
                    }

                    acbList = acbList.FindAll(delegate(AutoCompleteModel de) { return de.SerchString.Substring(0, str.Length) == str; });

    基本思路:因为集合是排序的,元素短的肯定在前面。先进行比较,确定前面长度小于检索词的元素,然后,用集合的RemoveRange方法将前面这些不符合条件的元素删除。然后再在集合中进行FindAll运算,就不会出现前面提到的错误了。希望王老师给与指正。

    再次感谢!

    ly_he


    ly_he

    2019年9月2日 23:17
  • Hi,

    这方法确实比整体遍历来的高效。

    但是在使用以下代码之前已经可以正确过滤不符合的字符串了。

        acbList = acbList.FindAll(delegate(AutoCompleteModel de) { return de.SerchString.Substring(0, str.Length) == str; });

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年9月3日 2:10
    版主