Строка содержит IgnoreCase в VB.NET - PullRequest
2 голосов
/ 09 сентября 2011

В C # есть проблема: не существует нечувствительного к регистру метода String.Contains (см. Без учёта регистра '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?

Ответы [ 4 ]

8 голосов
/ 09 сентября 2011

(теперь я вижу, что ваш вопрос также касается выражений, и у меня нет особого опыта с ними, но, к счастью, Джон Скит может помочь вам с этим. Что касается других частей вашей проблемы, мой первоначальный ответниже.)


InStr существует внутри Microsoft.VisualBasic.Strings.Пример вызова его из кода C #

string myString = "Hello World";
int position = Microsoft.VisualBasic.Strings.InStr(myString, "world");

Конечно, если бы я хотел получить регистронезависимый результат, я бы выбрал перегрузку IndexOf, существующую в System.String, которая позволяет мне указыватьa StringComparison.

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

Также обратите внимание, что InStr начинается с 1 для найденных предметов и IndexOf начинается с 0 для таких предметов.index != position в этом фрагменте кода.

2 голосов
/ 09 сентября 2011

Увидев ваше редактирование, это имеет больше смысла - вы не можете вызвать такой метод расширения.Метод расширения это просто статический метод, поэтому вызывайте его так.Например:

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

, где MyExtensions - класс, объявляющий метод расширения Contains.

2 голосов
/ 09 сентября 2011

Непосредственное окно Visual Studio немного отличается от обычного выполнения метода из скомпилированной программы. Это немного отличается от выполнения метода расширения в отладчике (на самом деле это то же самое).

Это не очень хорошо поддерживалось в Visual Studio 2005 или 2008. Там мало что можно сделать, чтобы заставить его работать, кроме как вызывать его с помощью формы без расширения

TheModule.Contains(source, toTest)

Поддержка этого значительно улучшена в 2010 году, и я ожидаю, что он будет работать.

1 голос
/ 09 сентября 2011

Вы можете принять предложение Энтони и создать метод расширения (или просто обычный метод) и использовать IndexOf:

<Extension()>
Public Shared Function CaseInsensitiveContains(source As String, value As String) As Boolean
    Return source.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...