Пример #1
0
        public override bool ПопробоватьДобавить(object объект)
        {
            if (объект == null)
            {
                if (ТекущаяГруппа == null)
                {
                    return(false);
                }
                ИсходящийШаблон.ПопробоватьДобавить(ТекущаяГруппа);
                ТекущаяГруппа = null;
                return(true);
            }

            //var ассСимвол = (Символ) объект;
            //ассСимвол.АссоциированныеОбъекты.Add(this);

            if (ТекущаяГруппа == null)
            {
                ТекущаяГруппа = new ИменованнаяГруппа2()
                {
                    ИмяГруппы = ИмяШаблона, ШаблонГруппы = this
                };
            }
            ТекущаяГруппа.Add(объект);
            // отправить объект транзитом для частных случаев
            ТранзитныйШаблон.ПопробоватьДобавить(объект);
            return(true);
        }
        public override void ПолучиСообщение(Связь связь, ПримитивИлиАдрес сообщение)
        {
            // если сообщение просто символ или адрес объекта
            if (Множество.Contains(сообщение))
            {
                return;
            }
            Множество.Add(сообщение);

            // если получаются сообщения интерактивно по одному символу
            var объект = сообщение;

            if (объект == null) // сигнал завершения
            {
                if (_режимДобавления)
                {
                    //событие добавлен новый список объектов
                    МножествоСписков.Add(ТекущийОбъектСписок);           //если список отсортирован, можно вставить в нужное место
                    ОтослатьСообщениеВсемИсходящим(ТекущийОбъектСписок); // отправиться только адрес
                }
                else
                {
                    // у нас есть список подходящих, объект с совпадающей длиной и есть совпадение ( в отсортированном должен быть первым элементом)
                    var длинаОбъекта     = ТекущийОбъектСписок.Count;
                    var номерПодходящего = -1;
                    for (int i = 0; i < СписокПодходящихОбъектов.Count; i++)
                    {
                        if (длинаОбъекта == СписокПодходящихОбъектов[i].Count)
                        {
                            номерПодходящего    = i;
                            ТекущийОбъектСписок = СписокПодходящихОбъектов[i];
                            // событие найден подходящий объект - т.е. список реакций не пустой
                            ОтослатьСообщениеВсемИсходящим(СписокПодходящихОбъектов[i]);
                            break;

                            // обнулить все и выйти
                        }
                    }
                    if (номерПодходящего == -1)                    //все подходящие длиннее
                    {
                        МножествоСписков.Add(ТекущийОбъектСписок); //если список отсортирован, можно вставить в нужное место
                        //событие добавлен новый список объектов
                        ОтослатьСообщениеВсемИсходящим(ТекущийОбъектСписок);
                    }
                }

                _режимДобавления         = false;
                ТекущийИндекс            = 0;
                СписокПодходящихОбъектов = null;
                ТекущийОбъектСписок      = null;
                return;
            }
            if (ТекущийИндекс == 0)
            {
                СписокПодходящихОбъектов = МножествоСписков;
                ТекущийОбъектСписок      = new ИменованнаяГруппа2()
                {
                    ИмяГруппы = "Имя Этого Словаря"
                };
            }

            ТекущийОбъектСписок.Add(объект);
            if (!_режимДобавления)
            {
                СписокПодходящихОбъектов = НайтиПодходящиеПоТекущемуИндексу(объект);
                if (СписокПодходящихОбъектов.Count == 0) //нет ни одного подхлдящего - сброс поиска
                {
                    _режимДобавления = true;
                    //повторить поиск для нуля Это для поиска подстроки
                }
                // посыл промежуточных результатов
                ОтослатьСообщениеВсемИсходящим(СписокПодходящихОбъектов);// если режим добавления запрещен и подходящий только 1 можно предположить что набираемый список именно этот
            }
        }