public interface IStringsTransform
{
IEnumerable<string> Do(IEnumerable<string> lines);
}
internal class CompositeStringsTransform : IStringsTransform
private List<IStringsTransform> _transforms = new List<IStringsTransform>();
public CompositeStringsTransform(IEnumerable<IStringsTransform> transforms)
_transforms.AddRange(transforms);
public CompositeStringsTransform(params IStringsTransform[] transforms)
: this((IEnumerable<IStringsTransform>)transforms)
public List<IStringsTransform> Transforms
get { return _transforms; }
public IEnumerable<string> Do(IEnumerable<string> lines)
foreach (var transform in Transforms)
lines = transform.Do(lines);
return lines;
public override string ToString()
var sb = new StringBuilder();
sb.Append(" & ");
sb.Append(transform);
return sb.ToString().Substring(3);
public abstract class PerStringTransformBase : IStringsTransform
protected PerStringTransformBase()
Init();
foreach (string line in lines)
yield return Do(line);
protected abstract string Do(string line);
protected virtual void Init()
public class InvertCharsPerStringTransform : PerStringTransformBase
internal InvertCharsPerStringTransform()
protected override string Do(string line)
char[] lineChars = line.ToCharArray();
Array.Reverse(lineChars);
return new string(lineChars);
return TransformResources.InvertCharsPerStringTransform;
public class NumberPerStringTransform : PerStringTransformBase
private int _cpt = 0;
internal NumberPerStringTransform()
return string.Concat((++_cpt).ToString("000"), " : ", line);
protected override void Init()
base.Init();
_cpt = 0;
return TransformResources.NumberPerStringTransform;
public static class Transforms
private static List<IStringsTransform> _transforms;
public static List<IStringsTransform> TransformsAllowed
get
if (_transforms == null)
_transforms = new List<IStringsTransform>()
new NumberPerStringTransform(),
new InvertCharsPerStringTransform(),
new CompositeStringsTransform(
new InvertCharsPerStringTransform()),
new InvertCharsPerStringTransform())
};
return _transforms;