Как найти позицию подстроки или проверить вхождение в строку C#?
Мне нужно понять, есть ли в строке определённое слово, и если есть — узнать, с какой позиции оно начинается. Какие методы для этого есть в C#? Ещё видел CompareTo — это для того же самого или для другого?
2 ответа
Для поиска позиции есть IndexOf — он возвращает индекс первого вхождения или -1, если не найдено:
string s = "привет мир, привет всем";
int pos = s.IndexOf("привет"); // 0
int last = s.LastIndexOf("привет"); // 11 (последнее вхождение)
int notFound = s.IndexOf("пока"); // -1
Если нужно просто проверить наличие (без позиции) — удобнее Contains:
if (s.Contains("мир"))
Console.WriteLine("нашли");
Для поиска без учёта регистра:
int i = s.IndexOf("ПРИВЕТ", StringComparison.OrdinalIgnoreCase);
Теперь про CompareTo — это совсем другое. Он не ищет подстроку, а сравнивает две строки лексикографически (для сортировки) и возвращает -1, 0 или 1:
int cmp = "apple".CompareTo("banana"); // отрицательное: apple раньше
Итого: IndexOf/Contains — поиск внутри строки, CompareTo — сравнение/сортировка строк.
Дополню: для проверки начала и конца строки есть отдельные удобные методы, чтобы не возиться с IndexOf:
string file = "report.pdf";
bool isPdf = file.EndsWith(".pdf"); // true
bool isImg = file.StartsWith("img_"); // false
Читается яснее, чем сравнивать результат IndexOf с нулём.