Сообщение Re: Generic остановить цепочку вызовов. от 01.06.2017 7:37
Изменено 01.06.2017 7:44 LWhisper
Re: Generic остановить цепочку вызовов.
Автор, ты описываешь конечный автомат.
Красивый, быстрый и понятный механизм ты можешь описать самостоятельно, но пока у тебя ничтожно мало состояний он будет проигрывать конструкции с if/return.
В топорном варианте, используя сахар C#, его можно описать так:
Красивый, быстрый и понятный механизм ты можешь описать самостоятельно, но пока у тебя ничтожно мало состояний он будет проигрывать конструкции с 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#, его можно описать так:
Если работа с промежуточным состоянием не требуется, то у тебя просто конвейер действий, который ты можешь инициализировать хоть параметрами, хоть делегатами, хоть фабриками:
Красивый, быстрый и понятный механизм ты можешь описать самостоятельно, но пока у тебя ничтожно мало состояний он будет проигрывать конструкции с 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;
}