【问题标题】:Iterate through a List and remove miscellaneous members in .NET遍历列表并删除 .NET 中的杂项成员
【发布时间】:2010-12-09 20:43:48
【问题描述】:

在使用std::list 的C++ 中,删除一个成员是一个简单的问题,即删除迭代器指向的内容。 (擦除语句返回列表的下一个有效成员。)

在 .NET 中,遍历列表并删除符合特定条件的成员的最佳方法是什么?

【问题讨论】:

    标签: .net vb.net list collections data-structures


    【解决方案1】:

    怎么样:

        Dim lst As New List(Of String)
    
        While lst.Count > 0
            lst.RemoveAt(0)
        End While
    

    另一种解决方案

    【讨论】:

      【解决方案2】:

      List<T>RemoveAll 方法,它接受一个谓词并删除项目:http://msdn.microsoft.com/en-us/library/wdka673a.aspx

      dinosaurs.RemoveAll(AddressOf EndsWithSaurus)

      Private Shared Function EndsWithSaurus(ByVal s As String) _
          As Boolean
          If (s.Length > 5) AndAlso _
              (s.Substring(s.Length - 6).ToLower() = "saurus") Then
              Return True
          Else
              Return False
          End If
      End Function
      

      【讨论】:

      • @Soviut: List<T> 不是线程安全的类,RemoveAll 方法也不是(它从不使用锁)。
      • 我非常喜欢这个——但是,我想要一份所有被 RemoveAll 的垃圾清单,以便我可以处理拒绝。
      【解决方案3】:

      如果您谈论 foreach 并使用 IEnumerator,答案是您无法在迭代时从 IEnumerable 中删除任何内容。 唯一的方法是将某些东西(项目的索​​引)存储在另一个列表中,然后循环删除它们

      但这是 cookie:http://www.koders.com/csharp/fidF2C8E1786AE76101911914CCA9286E25B398AED6.aspx?s=textbox

      " 允许您在 foreach 中间修改基础集合"

      【讨论】:

        【解决方案4】:

        在 .NET 中,您不能在使用枚举器进行迭代期间修改基础集合。所以你必须选择:

        • 使用良好的 for(;;) 循环遍历您的列表;

        • 创建一个没有符合您条件的项目的新列表:

          var list1 = ...; var list2 = list1.Where(item => !criteria(item)).ToList();

        (我在此示例中使用了 C#,但您应该能够将其转换为 VB)。

        【讨论】:

          【解决方案5】:

          假设您有一个List<T>,一种有效的方法是以相反的顺序遍历列表,同时删除项目:

          for(int i = myList.Count-1; i--; i>=0)
          {
              if (ShouldBeRemoved(myList[i]))
              {
                  myList.RemoveAt(i);
              }
          }
          

          如果您改为使用IEnumerable<T>,则会变得更加困难,因为您无法在迭代时更改列表。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-27
            • 1970-01-01
            • 2014-04-12
            • 1970-01-01
            相关资源
            最近更新 更多