using System;
using static System.Console;
using System.Collections.Generic;
public class Program {
public static void Main() {
var exemplo = "13032015joao";
//o último elemento poderia ser 200, por exemplo
//o que se for garantido que ele tenha o tamanho, evitaria o if no método
var partes = SplitFixed(exemplo, new List<int>() {2, 2, 4, 0});
foreach(var parte in partes) WriteLine(parte);
//poderia fazer as conversões aqui e jogar nas variáveis individuais
//alternativa com tipos, não sei se compensa o esforço
//para fazer certo daria o mesmo trabalho que fazer manualmente
//poucos casos esta forma seria realmente mais vantajosa e o ideal é que a conversão
//fosse feita através de lambdas contendo o código de conversão e não com tipos
var partes2 = SplitFixedTyped(exemplo, new List<Tuple<int, Type>>() {
new Tuple<int, Type>(2, typeof(int)),
new Tuple<int, Type>(2, typeof(int)),
new Tuple<int, Type>(4, typeof(int)),
new Tuple<int, Type>(0, typeof(string))});
foreach(var parte in partes2) {
WriteLine("Dado: {0} - Tipo {1}", parte, parte.GetType());
}
}
public static List<String> SplitFixed(string texto, List<int> tamanhos) {
var partes = new List<String>();
var posicao = 0;
foreach(var tamanho in tamanhos) {
if (tamanho > 0) { //padronizei que 0 significa que deve ir até o fim
partes.Add(texto.Substring(posicao, tamanho));
} else {
// o ideal é que não tenha essa parte e todos os tamanhos sejam definidos
//o 0 só pode ser usado como último parâmetro.
partes.Add(texto.Substring(posicao));
}
posicao += tamanho;
}
return partes;
}
//esta implmentação é um pouco ingênua, não funciona em todas as situações mas funciona com o básico
public static List<object> SplitFixedTyped(string texto, List<Tuple<int, Type>> tamanhos) {
var partes = new List<object>();
var posicao = 0;
foreach(var tamanho in tamanhos) {
if (tamanho.Item1 > 0) { //padronizei que 0 significa que deve ir até o fim
partes.Add(Convert.ChangeType(texto.Substring(posicao, tamanho.Item1), tamanho.Item2));
} else {
// o ideal é que não tenha essa parte e todos os tamanhos sejam definidos
//o 0 só pode ser usado como último parâmetro.
partes.Add(texto.Substring(posicao));
}
posicao += tamanho.Item1;
}
return partes;
}
}
//https://pt.stackoverflow.com/q/54235/101
dXNpbmcgU3lzdGVtOwp1c2luZyBzdGF0aWMgU3lzdGVtLkNvbnNvbGU7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoJCQkJCQpwdWJsaWMgY2xhc3MgUHJvZ3JhbSB7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpIHsKCQl2YXIgZXhlbXBsbyA9ICIxMzAzMjAxNWpvYW8iOwoJCS8vbyDDumx0aW1vIGVsZW1lbnRvIHBvZGVyaWEgc2VyIDIwMCwgcG9yIGV4ZW1wbG8KCQkvL28gcXVlIHNlIGZvciBnYXJhbnRpZG8gcXVlIGVsZSB0ZW5oYSBvIHRhbWFuaG8sIGV2aXRhcmlhIG8gaWYgbm8gbcOpdG9kbwoJCXZhciBwYXJ0ZXMgPSBTcGxpdEZpeGVkKGV4ZW1wbG8sIG5ldyBMaXN0PGludD4oKSB7MiwgMiwgNCwgMH0pOwoJCWZvcmVhY2godmFyIHBhcnRlIGluIHBhcnRlcykgV3JpdGVMaW5lKHBhcnRlKTsKCQkvL3BvZGVyaWEgZmF6ZXIgYXMgY29udmVyc8O1ZXMgYXF1aSBlIGpvZ2FyIG5hcyB2YXJpw6F2ZWlzIGluZGl2aWR1YWlzCgkJCgkJLy9hbHRlcm5hdGl2YSBjb20gdGlwb3MsIG7Do28gc2VpIHNlIGNvbXBlbnNhIG8gZXNmb3LDp28KCQkvL3BhcmEgZmF6ZXIgY2VydG8gZGFyaWEgbyBtZXNtbyB0cmFiYWxobyBxdWUgZmF6ZXIgbWFudWFsbWVudGUKCQkvL3BvdWNvcyBjYXNvcyBlc3RhIGZvcm1hIHNlcmlhIHJlYWxtZW50ZSBtYWlzIHZhbnRham9zYSBlIG8gaWRlYWwgw6kgcXVlIGEgY29udmVyc8OjbwoJCS8vZm9zc2UgZmVpdGEgYXRyYXbDqXMgZGUgbGFtYmRhcyBjb250ZW5kbyBvIGPDs2RpZ28gZGUgY29udmVyc8OjbyBlIG7Do28gY29tIHRpcG9zCgkJdmFyIHBhcnRlczIgPSBTcGxpdEZpeGVkVHlwZWQoZXhlbXBsbywgbmV3IExpc3Q8VHVwbGU8aW50LCBUeXBlPj4oKSB7CgkJCW5ldyBUdXBsZTxpbnQsIFR5cGU+KDIsIHR5cGVvZihpbnQpKSwgCgkJCW5ldyBUdXBsZTxpbnQsIFR5cGU+KDIsIHR5cGVvZihpbnQpKSwKCQkJbmV3IFR1cGxlPGludCwgVHlwZT4oNCwgdHlwZW9mKGludCkpLAoJCQluZXcgVHVwbGU8aW50LCBUeXBlPigwLCB0eXBlb2Yoc3RyaW5nKSl9KTsKCQlmb3JlYWNoKHZhciBwYXJ0ZSBpbiBwYXJ0ZXMyKSB7CgkJCVdyaXRlTGluZSgiRGFkbzogezB9IC0gVGlwbyB7MX0iLCBwYXJ0ZSwgcGFydGUuR2V0VHlwZSgpKTsKCQl9CgkJCgl9CglwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBTcGxpdEZpeGVkKHN0cmluZyB0ZXh0bywgTGlzdDxpbnQ+IHRhbWFuaG9zKSB7CgkJdmFyIHBhcnRlcyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKCQl2YXIgcG9zaWNhbyA9IDA7CgkJZm9yZWFjaCh2YXIgdGFtYW5obyBpbiB0YW1hbmhvcykgewoJCQlpZiAodGFtYW5obyA+IDApIHsgLy9wYWRyb25pemVpIHF1ZSAwIHNpZ25pZmljYSBxdWUgZGV2ZSBpciBhdMOpIG8gZmltCgkJCSAgICBwYXJ0ZXMuQWRkKHRleHRvLlN1YnN0cmluZyhwb3NpY2FvLCB0YW1hbmhvKSk7CgkJCX0gZWxzZSB7CgkJCQkvLyBvIGlkZWFsIMOpIHF1ZSBuw6NvIHRlbmhhIGVzc2EgcGFydGUgZSB0b2RvcyBvcyB0YW1hbmhvcyBzZWphbSBkZWZpbmlkb3MKCQkJCS8vbyAwIHPDsyBwb2RlIHNlciB1c2FkbyBjb21vIMO6bHRpbW8gcGFyw6JtZXRyby4KCQkJICAgIHBhcnRlcy5BZGQodGV4dG8uU3Vic3RyaW5nKHBvc2ljYW8pKTsKCQkJfQoJCQlwb3NpY2FvICs9IHRhbWFuaG87CgkJfQoJCXJldHVybiBwYXJ0ZXM7Cgl9CgkvL2VzdGEgaW1wbG1lbnRhw6fDo28gw6kgdW0gcG91Y28gaW5nw6pudWEsIG7Do28gZnVuY2lvbmEgZW0gdG9kYXMgYXMgc2l0dWHDp8O1ZXMgbWFzIGZ1bmNpb25hIGNvbSBvIGLDoXNpY28KCXB1YmxpYyBzdGF0aWMgTGlzdDxvYmplY3Q+IFNwbGl0Rml4ZWRUeXBlZChzdHJpbmcgdGV4dG8sIExpc3Q8VHVwbGU8aW50LCBUeXBlPj4gdGFtYW5ob3MpIHsKCQl2YXIgcGFydGVzID0gbmV3IExpc3Q8b2JqZWN0PigpOwoJCXZhciBwb3NpY2FvID0gMDsKCQlmb3JlYWNoKHZhciB0YW1hbmhvIGluIHRhbWFuaG9zKSB7CgkJCWlmICh0YW1hbmhvLkl0ZW0xID4gMCkgeyAvL3BhZHJvbml6ZWkgcXVlIDAgc2lnbmlmaWNhIHF1ZSBkZXZlIGlyIGF0w6kgbyBmaW0KCQkJICAgIHBhcnRlcy5BZGQoQ29udmVydC5DaGFuZ2VUeXBlKHRleHRvLlN1YnN0cmluZyhwb3NpY2FvLCB0YW1hbmhvLkl0ZW0xKSwgdGFtYW5oby5JdGVtMikpOwoJCQl9IGVsc2UgewoJCQkJLy8gbyBpZGVhbCDDqSBxdWUgbsOjbyB0ZW5oYSBlc3NhIHBhcnRlIGUgdG9kb3Mgb3MgdGFtYW5ob3Mgc2VqYW0gZGVmaW5pZG9zCgkJCQkvL28gMCBzw7MgcG9kZSBzZXIgdXNhZG8gY29tbyDDumx0aW1vIHBhcsOibWV0cm8uCgkJCSAgICBwYXJ0ZXMuQWRkKHRleHRvLlN1YnN0cmluZyhwb3NpY2FvKSk7CgkJCX0KCQkJcG9zaWNhbyArPSB0YW1hbmhvLkl0ZW0xOwoJCX0KCQlyZXR1cm4gcGFydGVzOwoJfQp9CgovL2h0dHBzOi8vcHQuc3RhY2tvdmVyZmxvdy5jb20vcS81NDIzNS8xMDE=