在C#中存在一个问题:没有不区分大小写的String.Contains
方法(请参阅Case insensitive 'Contains(string)')。
在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
函数的位置(谁拥有,汇集了什么)?
答案 0 :(得分:8)
(我现在看到你的问题也涉及表达式,我没有太多经验,但谢天谢地Jon Skeet可以帮助你。至于问题的其他部分,我原来的答案在下面。)
InStr
位于Microsoft.VisualBasic.Strings
内。从C#代码
string myString = "Hello World";
int position = Microsoft.VisualBasic.Strings.InStr(myString, "world");
当然,如果我想要一个不区分大小写的结果,我会选择IndexOf
上存在的System.String
重载,允许我指定StringComparison
。
int index = myString.IndexOf("world", StringComparison.CurrentCultureIgnoreCase);
另请注意,对于找到的项目,InStr
从1开始,对于此类项目,IndexOf
从0开始。此代码段中的index != position
。
答案 1 :(得分:2)
Visual Studio的即时窗口与编译程序中方法的正常执行略有不同。它与在调试器下执行扩展方法没什么不同(实际上它是一样的)。
这在Visual Studio 2005或2008中得不到很好的支持。除了通过它的非扩展方法形式调用它之外,没有太多工作可以使它工作
TheModule.Contains(source, toTest)
2010年对它的支持大大改善,我希望它能够发挥作用。
答案 2 :(得分:2)
看过你的编辑后,它更有意义 - 你无法调用这样的扩展方法。扩展方法只是一个静态方法,所以这样调用它。例如:
expr = Expression.Call(GetType(MyExtensions), "Contains", Nothing, _
myStringParam, constantExpression, _
Expression.Constant(StringComparison.InvariantCultureIgnoreCase))
其中MyExtensions
是声明Contains
扩展方法的类。
答案 3 :(得分:1)
您可以采取Anthony的建议并制作扩展方法(或只是一种常规方法)并使用IndexOf:
<Extension()>
Public Shared Function CaseInsensitiveContains(source As String, value As String) As Boolean
Return source.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0
End Function