【问题标题】:How to remove lines from string which has nothing except a blank newline?如何从除了空白换行符之外什么都没有的字符串中删除行?
【发布时间】:2018-04-04 22:32:48
【问题描述】:

我的表单中有两个 TextBoxes 启用了 Multiline 和一个 Button。比如说 tB1tB2tB1tB2 组成组号,Button 点击事件从 中删除所有字符串(数字) tB1 出现在 tB2 上。但是由于所有数字都被 NewLine 分隔,通过与另一个字符串匹配来替换字符串会导致之间出现很多空行。

示例 -tB1 值:

1

2

3

4

5

6

7

8

9

10

示例 -tB2 值:

3

7

8

我得到了什么:

1

2

[空白行]

4

5

6

[空白行]

[空白行]

9

10

我想要的:

1

2

4

5

6

9

10

我正在使用代码:

Dim strFix() as String

Private Sub Button1_Click() Handles Button1.Click
    strFix = Split(tB2.Text, vbNewLine)
    For Each str1 as String In strFix
        tb1.Text= tb1.Text.Replace(str1, "")
    Next
End Sub

注意:使用 .Trim() 并不能解决这个问题,因为它只会删除最后的空白行或空格。

【问题讨论】:

    标签: string vb.net trim


    【解决方案1】:

    String.Replace 无助于删除这些行。您必须创建一个没有出现在 Tb2 中的新行列表。

    您可以使用TextBox.Lines 获取所有行的数组。 LINQ 简化了任务:

    Dim onlyInTb1 = tB1.Lines.Except(tB2.Lines)
    tB1.Lines = onlyInTb1.ToArray()
    

    经典的非LINQ方式是使用List(Of String)

    Dim onlyInTb1List As New List(Of String)
    Dim tb2Lines = tb2.Lines
    For Each tb1Line In tB1.Lines
        If Not tb2Lines.Contains(tb1Line) 
            onlyInTb1List.Add(tb1Line)
        End If
    Next
    tb1.Lines = onlyInTb1List.ToArray()
    

    最后一种没有textBox.Lines-“trick”的方法与String.SplitString.Join

    Dim tb1Lines = tB1.Text.Split({Environment.NewLine}, StringSplitOptions.None)
    Dim tb2Lines = tB2.Text.Split({Environment.NewLine}, StringSplitOptions.None)
    Dim onlyInTb1 = tb1Lines.Except( tb2Lines )
    tB1.Text = String.Join(Environment.NewLine, onlyInTb1)
    

    【讨论】:

      【解决方案2】:

      我找到了适合我的解决方案。

      Dim strFix() As String
      
      Private Sub FixBlankLines ()
          strFix = Split(tB2.Text, vbNewLine)
          For Each str1 as String In strFix
              tb1.Text= tb1.Text.Replace(str1, "")
          Next
          strFix = Split(tb1.Text, vbNewLine)
          tb1.Text = ""
          For Each str2 As String In strFix
              If str2 <> "" Then
                   tb1.Text += Val(str2).ToString("00000") + vbNewLine
              End If
          Next
          tb1.Text = tb1.Text.Trim
      End Sub
      

      【讨论】:

        【解决方案3】:

        我认为这是因为 For Each 循环而发生的。每次循环遍历一个项目时,它都会“加倍”此代码。

        【讨论】:

        • 不,伙计,我不认为这是问题所在。实际上发生这种情况是因为数组包含一个字符串而不是新行,所以当我替换字符串时,替换将新行单独保留在行中:D
        【解决方案4】:
        txtResult.Lines = txtSource.Lines.Where(Function(line) line.Trim() <> String.Empty).ToArray()
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
        猜你喜欢
        • 2011-06-21
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多