• C# Индексатор массива объектов - почему так (см.)?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Т.е. data[index] - это у нас объект класса Person

    Не совсем так, это не объект класса Person, а элемент с индексом index в массиве data.
    Индексатор, как и обычные свойства, - это просто сахарный синтаксис для создания методов геттера и сеттера (например, поля).

    Обычное свойство заменяется на методы GetProperty() и SetProperty(<type> value).
    А индексатор заменяется на методы GetIndexator(int index) и SetIndexator(int index, <type> value).

    В этих методах можно писать что угодно, в вашем первом варианте вы пишете код доступа к массиву data. Но тип аргументов (index и value) определяются типом индексатора, то есть, вы можете сделать вот так:
    Person[] data;
    
    public string this[int index]
    {
        get
        {
            return data[index]?.Name;
        }
        set
        {
            if (data[index] == null) data[index] = new Person();
            data[index].Name = value;
        }
    }

    Или даже вот так:
    Person[] data;
    
    public Person this[string name]
    {
        get
        {
            return data.FirstOrDefault(p => p.Name == name);
        }
        set
        {
            for (var index = 0; index < data.Length; index++)
            {
                if (person.Name == name)
                {
                    data[index] = value;
                    break;
                }
            }
        }
    }


    То есть, вы не можете сделать так, как вы написали:
    set
    {
         data[index].Name = value;
    }

    потому что типом value будет Person, а не string. (вряд ли, что у вас у свойства Name тоже тип Person, или у вас есть implicit приведение из Person в string).

    А что если там не один только Name будет, ещё поля ??..

    А если у вас там больше свойств, то будьте добры указать это в коде. Точно так же, как и если только один Name, в общем-то.
    Ответ написан
    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++;
        }
    }
    Ответ написан
    33 комментария
  • "Подтвердите электронную квитанцию". Думаете, меня взломали?

    sim3x
    @sim3x
    https://support.google.com/calendar/answer/6110973...

    Report inappropriate calendar invites or events

    If you see a suspicious invitation or event on your calendar, report it as spam.

    First, report the event as spam

    Don’t reply to event invites from your phone. Instead, follow the directions below to report the event as spam on your computer.
    When you report one event, all events from that organizer will be removed from your calendar.
    How to report an event:
    On your computer, open Google Calendar.
    Double click the event you’d like to report.
    At the top, click More Actions and then Report as Spam.
    Ответ написан
    2 комментария