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