linq C#中是否有类似VB.NET的操作符?

nhhxz33t  于 2023-06-03  发布在  C#
关注(0)|答案(4)|浏览(771)

我正在重写一个vb.net应用程序,我不能说我对vb很在行。我需要用C#写这个等价:

Dim bigList = (From gme In dtx.gmc_message_elements 
              Where gme.element_key_name Like "*email" _
              Or gme.element_key_name Like "*web" 
              Or gme.element_key_name Like "*both" _
              Select gme.element_key_name Distinct).ToList()

到目前为止,我有:

var bigList = (from gme in dtx.gmc_message_elements 
               where gme.element_key_name Like "*email" 
               || gme.element_key_name Like "*web" 
               || gme.element_key_name Like "*both" 
               select gme.element_key_name).FirstOrDefault().ToList();

正如你所看到的,我不确定类似操作符的等价物是什么。我通过几个代码转换器运行这个,他们不断抛出错误。

2fjabf4q

2fjabf4q1#

若要获得最等效的功能,请确保C#项目引用了Microsoft.VisualBasic程序集。
然后,您可以直接从C#中使用VB.NET Like操作符,例如。

LikeOperator.LikeString(gme.element_key_name, "*web", CompareMethod.Text);

请确保包括

using Microsoft.VisualBasic.CompilerServices;

这将获得最等效的功能,但将是我认为有点黑客。
您的其他选择是使用String.StartsWithString.EndsWithString.ContainsRegex

j2cgzkjk

j2cgzkjk2#

根据需要使用stringStartsWithEndsWithContains静态方法。

xuo3flqw

xuo3flqw3#

Regex是最好的选择。由于Like操作支持 *,?、#和[],我认为可以使用Regex库轻松匹配复杂的模式。例如,下面的行将返回true。
"aBBBa" Like "a*a" "ajhfgZ1" Like "*Z[12]"
这取决于您的应用程序。如果你只是用它来匹配一个简单的硬编码字符串,你可以直接使用String.Contains、String、StartsWith或String.EndsWith,但是对于复杂的匹配,使用Regex会得到最好的结果。

2ekbmq32

2ekbmq324#

正如其他人已经指出的那样,C#中没有Like运算符。
而且它在VB.Net for .net标准中不可用。(已为.net再次添加)
我有一个例子,模式是用户输入。迁移到网络标准,我唯一的选择就是自己实现它。我选择将模式转换为等价的正则表达式:

<Extension()>
Public Function VbLike(str As String, pattern As String) As Boolean
    Dim resultPattern = New Text.StringBuilder
    Dim insideList = False
    Dim prevInsideList = False
    For i = 0 To pattern.Length - 1
        Dim c = pattern(i)
        Dim tempInsideList = insideList

        ' Manage pattern start
        If i = 0 AndAlso c <> "*"c Then
            resultPattern.Append("^"c)
        End If

        ' Manage characterlists
        If c = "["c AndAlso Not insideList Then
            insideList = True
            resultPattern.Append(c)
        ElseIf c = "]"c AndAlso insideList Then
            insideList = False
            resultPattern.Append(c)

            ' Special chars for Like that need to be converted
        ElseIf c = "!"c AndAlso insideList AndAlso Not prevInsideList Then
            resultPattern.Append("^"c)
        ElseIf c = "?"c AndAlso Not insideList Then
            resultPattern.Append("."c)
        ElseIf c = "#"c AndAlso Not insideList Then
            resultPattern.Append("\d")
        ElseIf c = "*"c AndAlso i = 0 Then
            ' Nothing to append
        ElseIf c = "*"c AndAlso i = pattern.Length - 1 Then
            ' Nothing to append
        ElseIf c = "*"c AndAlso Not insideList Then
            resultPattern.Append(".*")

            ' Special chars for Regex that need to be escaped
        ElseIf c = "."c OrElse c = "\"c OrElse c = "("c OrElse c = ")"c Then
            resultPattern.Append("\"c)
            resultPattern.Append(c)
        Else
            resultPattern.Append(c)
        End If

        ' Manage pattern end
        If i = pattern.Length - 1 AndAlso c <> "*"c Then
            resultPattern.Append("$"c)
        End If

        prevInsideList = tempInsideList
    Next

    Return Regex.IsMatch(str, resultPattern.ToString, RegexOptions.Singleline Or RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant)
End Function

相关问题