C# 字符串包含VB.NET中的IgnoreCase

C# 字符串包含VB.NET中的IgnoreCase,c#,.net,vb.net,string,C#,.net,Vb.net,String,在C#中存在一个问题:没有不区分大小写的String.Contains方法(请参阅) 在VB.NET中,问题是相同的,但有一个解决方法: Dim Str As String = "UPPERlower" Dim b As Boolean = InStr(Str, "UpperLower") 但是,我对此没有什么“问题”: 1) 在Visual Studio的即时窗口中,此方法显示为 “未申报” 2) 如何动态调用此方法(什么 是否应该是“调用者”对象?实际上我应该这样称呼它: expr =

在C#中存在一个问题:没有不区分大小写的
String.Contains
方法(请参阅)

在VB.NET中,问题是相同的,但有一个解决方法:

Dim Str As String = "UPPERlower"
Dim b As Boolean = InStr(Str, "UpperLower") 
但是,我对此没有什么“问题”:

1) 在Visual Studio的即时窗口中,此方法显示为 “未申报”

2) 如何动态调用此方法(什么 是否应该是“调用者”对象?实际上我应该这样称呼它:

expr = Expression.Call(myStringParam, "Contains", Nothing, constantExpression, Expression.Constant(StringComparison.InvariantCultureIgnoreCase))

3)
InStr
函数位于何处(谁拥有,哪个汇编程序?

Visual Studio的即时窗口与编译程序中方法的正常执行略有不同。它与在调试器下执行扩展方法没有什么不同(实际上是一样的)

这在VisualStudio2005或2008中没有得到很好的支持。除了通过它的非扩展方法表单调用它之外,没有什么可以让它工作的

TheModule.Contains(source, toTest)
对它的支持在2010年有了很大的改善,我希望它能起作用

(我现在明白了,你的问题也涉及到表达,而我在这些方面没有太多的经验,但谢天谢地,乔恩·斯基特或许能够帮助你解决这个问题。至于你问题的其他部分,我的原始答案如下。)


InStr
存在于
Microsoft.VisualBasic.Strings
中。从C#代码调用它的示例

当然,如果我想要不区分大小写的结果,我会选择
System.String
上存在的
IndexOf
重载,它允许我指定
StringComparison

int index = myString.IndexOf("world", StringComparison.CurrentCultureIgnoreCase);

还请注意,对于找到的项目,
InStr
从1开始,对于这些项目,
IndexOf
从0开始<代码>索引!=将放在这个代码片段中。

看到您的编辑后,它更有意义-您不能调用这样的扩展方法。扩展方法只是一个静态方法,所以这样称呼它。例如:

expr = Expression.Call(GetType(MyExtensions), "Contains", Nothing, _
           myStringParam, constantExpression, _
           Expression.Constant(StringComparison.InvariantCultureIgnoreCase))

其中,
MyExtensions
是声明
包含
扩展方法的类。

您可以采纳Anthony的建议,创建一个扩展方法(或只是一个普通方法)并使用IndexOf:

<Extension()>
Public Shared Function CaseInsensitiveContains(source As String, value As String) As Boolean
    Return source.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0
End Function

公共共享函数CaseInsensitiveContains(源为字符串,值为字符串)为布尔值
返回source.IndexOf(值,StringComparison.OrdinalIgnoreCase)>=0
端函数

您所说的“动态调用此方法”到底是什么意思?至于立即窗口,我怀疑它不能处理扩展方法,基本上…@Jon Skeet:他的意思是作为实例方法调用它。@serhio:对。提到表达式树会有帮助:)会添加一个说明如何执行此操作的答案。@serhio您能在您的问题中添加
Contains
方法的定义吗?谢谢,Jon。注意,在VB.NEt中,事情稍微复杂一些。。。因为扩展方法可以在模块中声明,而不仅仅是共享类。。。“希望”也适用于模块…@serhio:我相信模块无论如何都会编译成静态类-看看Reflector.apropos,那一章中的
Microsoft.VisualBasic.Strings.InStr
呢?我想也是一样,但是
GetType(Microsoft.VisualBasic.Strings)
@Jon Skeet:与模块(提议者)配合得非常好;)@塞希奥:是的,你可以用
InStr
做同样的事情。这正是我在解释这篇文章的问题2)时使用的。)只是在VB.NET中对其进行了编码)在扩展后缺少了一个
\uu
)\u本例中不需要。(VB 2010)
<Extension()>
Public Shared Function CaseInsensitiveContains(source As String, value As String) As Boolean
    Return source.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0
End Function