Я пытаюсь использовать опцию игнорирования регистра для «Содержит», и получаю эту ошибку:
CS1501 No overload for method 'Contains' takes 2 arguments
Это строка кода:
item.buildMach.Contains("co.net", StringComparison.CurrentCultureIgnoreCase)
При наведении курсора на «Содержит» intellisense сообщает, что у него есть 2 перегрузки, и похоже, что он знает, что у него есть второй аргумент.
Я пытаюсь сделать то, что есть в решении Матье Ренда: содержит - игнорировать регистр
Что мне нужно сделать, чтобы исправить эту ошибку и использовать регистр игнорирования?
Этот проект имеет целевую структуру .net framework 4.7.2.
Воспроизводимый пример:
"str".Contains("sT", StringComparison.OrdinalIgnoreCase);
Имеет ошибку: ни одна перегрузка метода «Содержит» не принимает 2 аргумента.
Я пробую то, что содержит Матье Ренда без учета регистра, но получаю эту ошибку.
В предоставленной ссылке есть статический класс StringExtensions, который вам нужно будет добавить в свой проект.
Если item.buildMach является Collection<string>, а не самой строкой, вы можете использовать для этого выражение LINQ
item.buildMach имеет тип (класс) процесса ValidationInfo, строку buildMach в классе.
StringComparison.CurrentCultureIgnoreCase — для .Net Core. Вам нужно использовать StringComparison.OrdinalIgnoreCaseЯ попытался изменить его на StringComparison.OrdinalIgnoreCase, но он по-прежнему говорит, что перегрузка метода не содержит 2 аргументов.





.NET Framework 4.7.2 действительно не содержит (без каламбура) такой перегрузки. Если вам нужно сравнение без учета регистра в .NET Framework, вы можете перед поиском использовать строчные буквы строки:
item.buildMach.ToLower().Contains("co.net");
@Michele Не используйте ToLower().Contains или ToLower().Equals и т. д., если вы можете выполнить сравнение, не создавая ненужный экземпляр строки.
Я только что понял, что это делает мое сравнение неудачным, потому что в co.net иногда используются заглавные буквы, а мы заставляем то, с чем сравниваем, быть строчными.
@IS4 - моя команда хочет, чтобы я сделал это, чтобы они могли неправильно использовать заглавные буквы для co.net, и сравнение все равно будет работать. Этот item.buildMach взят из длинного списка объектов, заполненных с помощью linq, поэтому он должен быть там объектом.
@Michele Еще лучшая причина использовать метод, предназначенный для сравнения без учета регистра. Пожалуйста, посмотрите мой ответ.
@IS4 - Я не вижу от вас опубликованного ответа или комментария.
@Мишель Стрэндж... эта ссылка работает? stackoverflow.com/a/78618492/1424244
@IS4 появился твой ответ. Ссылка тоже работает. Спасибо!
Перегрузка Contains принятия StringComparison была добавлена в .NET Core 2.1 и никогда не перенесена обратно в .NET Framework. Однако заменить его довольно просто без потери эффективности:
item.buildMach.IndexOf("co.net", StringComparison.CurrentCultureIgnoreCase) != -1
Вы также можете превратить его в метод расширения:
static class StringExtensions
{
public static bool Contains(this string str, string value, StringComparison comparisonType)
{
return str.IndexOf(value, comparisonType) != -1;
}
}
Также рассмотрите возможность использования OrdinalIgnoreCase, если вам не нужны сравнения с учетом языка, поскольку это намного быстрее.
Как нам воспроизвести вашу проблему?