Как можно в методе IndexOfAny сделать игнорирование регистра?

Да, можно для этого использовать метод просто IndexOf, который принимает StringComparison, можно сделать игнорирование регистра. Но как именно сделать в методе IndexOfAny?

string str = "GuB"; 
char[]mass = {'U'}; 
int index = str.IndexOfAny(mass,0,mass.Length) ; 
Console.WriteLine(index);

Перегрузок у данного метода для игнорирование регистра нет, информации на просторах интернета нету. Как вообще при переборе массива (сравнении) игнорировать регистр? Прямо в методе IndexOfAny


Ответы (1 шт):

Автор решения: Nowhere Man

Если в исходной строке и/или массиве искомых символов допускаются символы разных регистров, то следует привести к какому-то одному регистру.

Также следует учесть, что метод String.IndexOfAny(char[] arr, int start, int count) будет проверять count символов в заданной строке, то есть если передать туда размер массива из одного элемента, то ничего не найдется.

Дополнение: При преобразовании в верхний регистр в общем случае (когда могут использоваться некоторые экзотические алфавиты и символы) нужно устанавливать CultureInfo.InvariantCulture либо в текущем потоке выполнения, либо в каждом преобразовании регистра.

Пример 1.
В верхний регистр переводится только строка, в массиве заведомо только прописные буквы:

// для корректной обработки символов некоторых экзотических алфавитов
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

string str = "GuB";
string ups = str.ToUpper(); 
char[] mass = {'U'}; 
int index = ups.IndexOfAny(mass); 
Console.WriteLine(index); // 1

index = ups.IndexOfAny(mass, 0); 
Console.WriteLine(index); // 1

index = ups.IndexOfAny(mass, 0, mass.Length); // длина массива 1, проверить только 1 символ 
Console.WriteLine(index); // -1

index = ups.IndexOfAny(mass, 0, str.Length); // проверить всю строку 
Console.WriteLine(index); // 1

Пример 2.
В верхний регистр переводятся и строка и массив:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

string str = "ıGuB";  // турецкая ı без точки
string ups = str.ToUpper(); 
char[] mass = {'U', 'g', 'ı'};
char[] arr = new string(mass).ToUpper().ToCharArray();
int index = ups.IndexOfAny(arr); 
Console.WriteLine(index); // 0 -- первым найден символ 'ı'
→ Ссылка