fork download
  1. using System;
  2. using static System.Console;
  3. using System.Collections.Generic;
  4.  
  5. public class Program {
  6. public static void Main() {
  7. var exemplo = "13032015joao";
  8. //o último elemento poderia ser 200, por exemplo
  9. //o que se for garantido que ele tenha o tamanho, evitaria o if no método
  10. var partes = SplitFixed(exemplo, new List<int>() {2, 2, 4, 0});
  11. foreach(var parte in partes) WriteLine(parte);
  12. //poderia fazer as conversões aqui e jogar nas variáveis individuais
  13.  
  14. //alternativa com tipos, não sei se compensa o esforço
  15. //para fazer certo daria o mesmo trabalho que fazer manualmente
  16. //poucos casos esta forma seria realmente mais vantajosa e o ideal é que a conversão
  17. //fosse feita através de lambdas contendo o código de conversão e não com tipos
  18. var partes2 = SplitFixedTyped(exemplo, new List<Tuple<int, Type>>() {
  19. new Tuple<int, Type>(2, typeof(int)),
  20. new Tuple<int, Type>(2, typeof(int)),
  21. new Tuple<int, Type>(4, typeof(int)),
  22. new Tuple<int, Type>(0, typeof(string))});
  23. foreach(var parte in partes2) {
  24. WriteLine("Dado: {0} - Tipo {1}", parte, parte.GetType());
  25. }
  26.  
  27. }
  28. public static List<String> SplitFixed(string texto, List<int> tamanhos) {
  29. var partes = new List<String>();
  30. var posicao = 0;
  31. foreach(var tamanho in tamanhos) {
  32. if (tamanho > 0) { //padronizei que 0 significa que deve ir até o fim
  33. partes.Add(texto.Substring(posicao, tamanho));
  34. } else {
  35. // o ideal é que não tenha essa parte e todos os tamanhos sejam definidos
  36. //o 0 só pode ser usado como último parâmetro.
  37. partes.Add(texto.Substring(posicao));
  38. }
  39. posicao += tamanho;
  40. }
  41. return partes;
  42. }
  43. //esta implmentação é um pouco ingênua, não funciona em todas as situações mas funciona com o básico
  44. public static List<object> SplitFixedTyped(string texto, List<Tuple<int, Type>> tamanhos) {
  45. var partes = new List<object>();
  46. var posicao = 0;
  47. foreach(var tamanho in tamanhos) {
  48. if (tamanho.Item1 > 0) { //padronizei que 0 significa que deve ir até o fim
  49. partes.Add(Convert.ChangeType(texto.Substring(posicao, tamanho.Item1), tamanho.Item2));
  50. } else {
  51. // o ideal é que não tenha essa parte e todos os tamanhos sejam definidos
  52. //o 0 só pode ser usado como último parâmetro.
  53. partes.Add(texto.Substring(posicao));
  54. }
  55. posicao += tamanho.Item1;
  56. }
  57. return partes;
  58. }
  59. }
  60.  
  61. //https://pt.stackoverflow.com/q/54235/101
Success #stdin #stdout 0.02s 16364KB
stdin
Standard input is empty
stdout
13
03
2015
joao
Dado: 13 - Tipo System.Int32
Dado: 3 - Tipo System.Int32
Dado: 2015 - Tipo System.Int32
Dado: joao - Tipo System.String