String.contains — нет перегрузки для contains, принимает 2 аргумента

Я пытаюсь использовать опцию игнорирования регистра для «Содержит», и получаю эту ошибку:

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 аргумента.

Я пробую то, что содержит Матье Ренда без учета регистра, но получаю эту ошибку.

Как нам воспроизвести вашу проблему?

nicomp 13.06.2024 16:12

В предоставленной ссылке есть статический класс StringExtensions, который вам нужно будет добавить в свой проект.

GH DevOps 13.06.2024 16:13

Если item.buildMach является Collection<string>, а не самой строкой, вы можете использовать для этого выражение LINQ

ipodtouch0218 13.06.2024 16:15

item.buildMach имеет тип (класс) процесса ValidationInfo, строку buildMach в классе.

Michele 13.06.2024 16:15
StringComparison.CurrentCultureIgnoreCase — для .Net Core. Вам нужно использовать StringComparison.OrdinalIgnoreCase
Jonathan Willcock 13.06.2024 16:15

Я попытался изменить его на StringComparison.OrdinalIgnoreCase, но он по-прежнему говорит, что перегрузка метода не содержит 2 аргументов.

Michele 13.06.2024 16:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

.NET Framework 4.7.2 действительно не содержит (без каламбура) такой перегрузки. Если вам нужно сравнение без учета регистра в .NET Framework, вы можете перед поиском использовать строчные буквы строки:

item.buildMach.ToLower().Contains("co.net");

@Michele Не используйте ToLower().Contains или ToLower().Equals и т. д., если вы можете выполнить сравнение, не создавая ненужный экземпляр строки.

IS4 13.06.2024 16:31

Я только что понял, что это делает мое сравнение неудачным, потому что в co.net иногда используются заглавные буквы, а мы заставляем то, с чем сравниваем, быть строчными.

Michele 13.06.2024 16:36

@IS4 - моя команда хочет, чтобы я сделал это, чтобы они могли неправильно использовать заглавные буквы для co.net, и сравнение все равно будет работать. Этот item.buildMach взят из длинного списка объектов, заполненных с помощью linq, поэтому он должен быть там объектом.

Michele 13.06.2024 16:39

@Michele Еще лучшая причина использовать метод, предназначенный для сравнения без учета регистра. Пожалуйста, посмотрите мой ответ.

IS4 13.06.2024 17:06

@IS4 - Я не вижу от вас опубликованного ответа или комментария.

Michele 13.06.2024 17:08

@Мишель Стрэндж... эта ссылка работает? stackoverflow.com/a/78618492/1424244

IS4 13.06.2024 18:22

@IS4 появился твой ответ. Ссылка тоже работает. Спасибо!

Michele 17.06.2024 17:03
Ответ принят как подходящий

Перегрузка 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, если вам не нужны сравнения с учетом языка, поскольку это намного быстрее.

Другие вопросы по теме