【问题标题】:Remove All Occurrences of Word from a List从列表中删除所有出现的单词
【发布时间】:2018-06-15 11:56:00
【问题描述】:

给定单词列表...

Word Word Base Ball Ball Apple Cardinal

我将如何删除所有出现的“Word”和“Ball”?我做了一些研究,发现了list.RemoveAll 函数。我只是对如何在字符串列表上实现它有点困惑。对于这样的事情,将列表转换为数组会更好吗?

Public Function getListOfWords() As String()
    listOfWords.RemoveAll("the")
    Dim arrayA() As String = listOfWords.ToArray
    Return arrayA
End Function

【问题讨论】:

  • 你自己有没有尝试过?

标签: string vb.net list removeall


【解决方案1】:

这是在 List(Of String) 上使用 RemoveAll 的方法

Dim words = New List(Of String) From { "Word","Word","Base","Ball","Ball","Apple","Cardinal"}
Dim wordsRemoved = words.RemoveAll(Function(s) s = "Word" OrElse s = "Ball")
Console.WriteLine(wordsRemoved)
For Each s in words
   Console.WriteLine(s)
Next

在这种情况下,RemoveAll 需要一个接收字符串并返回布尔值 (A Predicate(Of T)) 的函数。该函数通过重复调用,一一接收序列中包含的元素,返回true表示移除元素,返回false表示保留元素

【讨论】:

    【解决方案2】:

    我知道它已得到答复并被接受。但是 bool 谓词似乎有点硬编码,就可扩展性而言,即如果您要删除的词是“Word”、“Ball”和“Apple”怎么办?现在必须在代码中更改谓词。我想你可以在谓词中聚合代码,但现在事情变得很愚蠢。

    您可能还认识到该问题需要LEFT OUTER JOIN 来解决它,它可以接受排除列表中的任意数量的元素。这是您可以使用的功能

    Public Function getListOfWords(words As IEnumerable(Of String),
                                   wordsToRemove As IEnumerable(Of String)) As String()
    
        Dim wordsRemoved = From word In words
                           Group Join wordToRemove In wordsToRemove
                               On word Equals wordToRemove Into Group
                           From g In Group.DefaultIfEmpty
                           Where g = ""
                           Select word
    
        Return wordsRemoved.ToArray()
    End Function
    

    现在,您可以将两个集合都包含在任意数量的列表中并调用函数

    Dim words = {"Word", "Word", "Base", "Ball", "Ball", "Apple", "Cardinal"}
    Dim wordsToRemove = {"Word", "Ball"}
    Dim wordsRemoved = getListOfWords(words, wordsToRemove)
    For Each s In wordsRemoved
        Console.WriteLine(s)
    Next
    

    【讨论】:

      【解决方案3】:

      假设重复项一个接一个:

      Dim s = "Word Word Base Ball Ball Apple Cardinal"
      Dim pattern = "(?i)(?'word'[a-z]+)(\s+\k'word')"
      Dim s2 = Regex.Replace(s, pattern, "${word}")
      

      【讨论】:

        猜你喜欢
        • 2013-03-04
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多