Информация об изменениях

Сообщение Re: Generic остановить цепочку вызовов. от 01.06.2017 7:37

Изменено 01.06.2017 7:44 LWhisper

Re: Generic остановить цепочку вызовов.
Автор, ты описываешь конечный автомат.
Красивый, быстрый и понятный механизм ты можешь описать самостоятельно, но пока у тебя ничтожно мало состояний он будет проигрывать конструкции с if/return.
В топорном варианте, используя сахар C#, его можно описать так:

    public class Program
    {
        public static void Main()
        {
            // где-то в коде
            var b = new b();
            var o = ProcessStrangeAlg(b);
        }

        private static b ProcessStrangeAlg(b model)
        {
            return StrangeAlg(model).LastOrDefault();
        }

        private static IEnumerable<b> StrangeAlg(b model)
        {
            foreach (var value in new[] {4, 5, 10, 20})
            {
                yield return model.go(value);
                if (model.value != null)
                    yield break;
            }
        }
    }
Re: Generic остановить цепочку вызовов.
Автор, ты описываешь конечный автомат.
Красивый, быстрый и понятный механизм ты можешь описать самостоятельно, но пока у тебя ничтожно мало состояний он будет проигрывать конструкции с if/return.
В топорном варианте, используя сахар C#, его можно описать так:

    public class Program
    {
        public static void Main()
        {
            // где-то в коде
            var b = new b();
            var o = ProcessStrangeAlg(b);
        }

        private static b ProcessStrangeAlg(b model)
        {
            return StrangeAlg(model).LastOrDefault();
        }

        private static IEnumerable<b> StrangeAlg(b model)
        {
            foreach (var value in new[] {4, 5, 10, 20})
            {
                model = model.go(value);
                yield return model;

                if (model.value != null)
                    yield break;
            }
        }
    }


Если работа с промежуточным состоянием не требуется, то у тебя просто конвейер действий, который ты можешь инициализировать хоть параметрами, хоть делегатами, хоть фабриками:

private static b ProcessStrangeAlg(b model)
        {
            foreach (var value in new[] { 4, 5, 10, 20 })
            {
                model = model.go(value);
                if (model.value != null)
                    return model;
            }

            return null;
        }