Определить кол-во вхождений строки в строку — почему не работает?

using System;
 
class Kata{
  static int stringCounter(string s1, string s2)
  {
 
    bool b_n = s1.Contains(s2);
    int count;
 
    if ( !b_n )
        return 0;
 
        int index, length;
    do
    {
        length = s2.Length;
        index = s1.IndexOf(s2);
        s1 = s1.Remove(index,length);
        count++;
    }
    while (b_n);
 
            return count; 
  }
 
    static void Main() {
        
        string ControL = "тук-тук!";
        Console.WriteLine(ControL);
        Console.Write($"\"тук\" is {stringCounter(ControL, "тук")} times...")
        Console.ReadKey();
    }
}


5ce7bc2a3d7fa390885128.png

Спасибо :)
  • Вопрос задан
  • 217 просмотров
Решения вопроса 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
1 - https://duckduckgo.com/?q=c%23+%D0%9E%D0%BF%D1%80%...
запрос c# Определить кол-во вхождений строки в строку (под спойлером)
z2ckAe3.png


2 -
пару коротких вариантов
using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace Occurrences
{
    class Program
    {
        static int method1(string source, string pattern)
            => new Regex(pattern).Matches(source).Count;

        static int method2(string source, string pattern)
            => source.Split(new string[] { pattern }, StringSplitOptions.None).Count() - 1;

        static void Main(string[] args)
        {
            var src = "тук - тук!";
            var ptn = "тук";
            Console.WriteLine($"'{ptn}' found on '{src}' use 'method1' {method1(src, ptn)} times...");
            Console.WriteLine($"'{ptn}' found on '{src}' use 'method2' {method2(src, ptn)} times...");
        }
    }
}
ну а по рукопашным вариантам.. ответ Foggy Finder пожалуй самодостаточен ))
Ответ написан
Комментировать
FoggyFinder
@FoggyFinder
Отбрасывая синтаксический ошибки (отсутствие точки с запятой и инициализации переменной) получаем следующую проблему:

Нет условия выхода из цикла - при текущей реализации программа упадет как только строка перестанет включать в себя вхождения.

Метод IndexOf вернет -1, в том случае если поиск оказался безрезультатным.

Очевидная проверка решает проблему:

if (index == -1)
    break;


Теперь к вопросу о том можно ли немного сократить код сохранив при этом подход.

Для начала использование метода Contains здесь выглядит избыточным - метод IndexOf вполне неплохо справится с этой задачей поиска.

Отдельная переменная length только создает лишний шум - длина подстроки остается неизменной.

Кроме того вместо метода Remove можно использовать метод Substring. Здесь большой разницы в использовании между ними нет, то лично мне кажется что название Substring лучше отражает суть происходящего. Но тут уже дело вкуса.

Напоследок - в C# принято называть методы с заглавной буквы, лучше соблюдать принятые соглашение об именовании.

Итого:

static int StringCounter(string s1, string s2)
{
    int count = 0;
    int index;
    while (true)
    {
        index = s1.IndexOf(s2);
        if (index == -1)
            return count;
        s1 = s1.Substring(index + s2.Length);
        count++;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы