从字符串中移除CRLF C#

4

我正在尝试将此VBA函数转换为C#函数,该函数可以从字符串中删除CRLF,并且新的函数需要实现相同的结果。

Private Function RemoveCRLFFromString(ByVal pString As Variant) As String
Dim i As Integer
Dim c As String * 1

 If IsNull(pString) Then
    RemoveCRLFFromString = ""
 Else
    For i = 1 To Len(pString)
        c = Mid$(pString, i, 1)
        If Asc(c) <> 10 And _
           Asc(c) <> 13 Then
           RemoveCRLFFromString = RemoveCRLFFromString & c
        End If
    Next i
 End If


 RemoveCRLFFromString = Left$(RemoveCRLFFromString, 9)

End Function

到目前为止,我已经想出了:
public static string RemoveCRLFFromString(string pString )
{
    if(String.IsNullOrEmpty(pString))
    {
        return pString ;
    }
    string lineSep = ((char) 0x2028).ToString();
    string paragraphSep = ((char)0x2029).ToString();

    return pString.Replace("\r\n", string.Empty).Replace("\n", string.Empty).Replace("\r", string.Empty).Replace(lineSep, string.Empty).Replace(paragraphSep, string.Empty);
}

但它没有达到相同的结果,有人能帮我调整我的C#函数,使其与VBA版本的结果相匹配吗?


1
精确的替换代码如下:return string.Replace("\n","").Replace("\r","").Substring(0, 9); - Gusman
@Gusman 嘿,Gusman,我一直很感激你的帮助。如果我理解正确,我应该用以下代码替换:return string.Replace("\n","").Replace("\r","").Substring(0, 9);,而不是使用 return pString.Replace("\r\n", string.Empty).Replace("\n", string.Empty).Replace("\r", string.Empty).Replace(lineSep, string.Empty).Replace(paragraphSep, string.Empty); - napi15
是的,您也可以删除这些字符串。 - Gusman
等一下,还有,空结果是不同的,让我把这个作为答案添加进去。 - Gusman
@Gusman 谢谢你,尽你所需的时间。非常感谢你的帮助。 - napi15
2个回答

7

您缺少空值检查(原始函数在这种情况下返回一个空字符串),并且还忘记了修剪字符串大小的Left$

public static string RemoveCRLFFromString(string pString)
{
    //Return empty string if null passed
    if(pString == null)
        return ""; 

    //Remove carriage returns
    var str = pString.Replace("\n","").Replace("\r",""); 

    //If len is more than 9 chars trim it
    return str.Length > 9 ? str.Substring(0, 9) : str;
}

2

VBA函数过于复杂,可以简化为:

Private Function RemoveCRLFFromString(ByVal pString As Variant) As String
    Dim s As String

    s = Nz(pString)  ' Available in Access VBA, in Excel you'd need a null check
    s = Replace(s, vbCr, "")
    s = Replace(s, vbLf, "")

    RemoveCRLFFromString = Left(s, 9)
End Function

一旦无用的复杂性被消除,将其翻译为C#就很简单了,留给读者作为练习。注意:
  • Nz(...) 变成 ... ?? ""
  • Replace(...) 变成 ....Replace(...)
  • Left 变成 Truncate,这不是一个内置方法,但可以通过长度检查轻松实现。

哦,由于您的方法不仅删除了CR和LF(它还截断了字符串),因此应更改其名称。


2
你好 Heinzi,当然了它很复杂,我正在开发一个Access应用程序,该程序是在1998年构建的,并试图将其编写成C# 2017应用程序 :) ……感谢您花时间优化VBA代码。 - napi15
@napi15:谢谢。嗯,说到“应该更新的旧代码”……;-) - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接