public interface IStringsTransform
{
IEnumerable<string> Do(IEnumerable<string> lines);
}
public abstract class PerStringTransformBase : IStringsTransform
public IEnumerable<string> Do(IEnumerable<string> lines)
foreach (string line in lines)
yield return Do(line);
protected abstract string Do(string line);
public class NumberPerStringTransform : PerStringTransformBase
private int _cpt = 0;
protected override string Do(string line)
return string.Concat((++_cpt).ToString("000"), " : ", line);
public class InvertCharsPerStringTransform : PerStringTransformBase
char[] lineChars = line.ToCharArray();
Array.Reverse(lineChars);
return new string(lineChars);
public class NumberPerStringTransform : IStringsTransform
return lines.Select((l, index) => string.Concat((index + 1).ToString("000"), " : ", l));
public class InvertCharsPerStringTransform : IStringsTransform
return lines.Select(l => new string(l.Reverse().ToArray()));
public static class FileUtil
public static IEnumerable<string> GetLines(string filePath)
using (var sr = new StreamReader(filePath))
string line;
while ((line = sr.ReadLine()) != null)
yield return line;
public static void WriteLines(string filePath, IEnumerable<string> lines)
using (var sw = new StreamWriter(filePath))
sw.WriteLine(line);
public static class FileTransform
public static void Transform(string fileInPath, string fileOutPath, IStringsTransform transform)
FileUtil.WriteLines(fileOutPath, transform.Do(FileUtil.GetLines(fileInPath)));
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()
};
return _transforms;
Init();
protected virtual void Init()
protected override void Init()
base.Init();
_cpt = 0;
public override string ToString()
return TransformResources.NumberPerStringTransform;