goto-Statement hier elegant?

  • C#

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von φConst.

    Hey, der Code von gestern ist mehr oder weniger Schrott und ein einziger Bottleneck.

    Der hier ist sauberer und logischer:

    Spoiler anzeigen

    C#-Quellcode

    1. public class DOMObject
    2. {
    3. public DOMObject Parent;
    4. public StringBuilder Begin = new StringBuilder();
    5. public StringBuilder End = new StringBuilder();
    6. public StringBuilder Attribute = new StringBuilder();
    7. public int Index;
    8. public List<DOMObject> Childs = new List<DOMObject>();
    9. public StringBuilder Content = new StringBuilder();
    10. public void Process(bool find)
    11. {
    12. string _begin = "";
    13. bool findEnd = false;
    14. bool findAttribute = false;
    15. for (int i = Index; i < Program.HTML.Length - 1; i++)
    16. {
    17. char c = Program.HTML[i];
    18. char c_1 = Program.HTML[i + 1];
    19. if (find)
    20. {
    21. if (c == '>')
    22. {
    23. _begin = Begin.ToString();
    24. find = false;
    25. if (!Program.Tags.Contains(_begin))
    26. {
    27. Parent.Index = i;
    28. return;
    29. }
    30. }
    31. else
    32. {
    33. if (c == ' ')
    34. {
    35. findAttribute = true;
    36. continue;
    37. }
    38. if (findAttribute)
    39. Attribute.Append(c);
    40. else
    41. Begin.Append(c);
    42. }
    43. }
    44. else
    45. {
    46. if (c == '/')
    47. findEnd = true;
    48. if (findEnd)
    49. {
    50. if (c == '>')
    51. {
    52. Parent.Index = i;
    53. return;
    54. }
    55. End.Append(c);
    56. }
    57. }
    58. if (!find && !findEnd && c != '<' && c != '>')
    59. Content.Append(c);
    60. if (c == '<' && c_1 != '/')
    61. {
    62. Content.Append('!');
    63. DOMObject child = new DOMObject()
    64. {
    65. Parent = this,
    66. Index = i + 1
    67. };
    68. Childs.Add(child);
    69. Childs[Childs.Count - 1].Process(true);
    70. i = Index;
    71. }
    72. }
    73. }
    74. public override string ToString()
    75. {
    76. return Begin.ToString();
    77. }
    78. }


    Aufruf:

    C#-Quellcode

    1. public static string HTML = "<html id=lol><p><hr>HALLO<hr></p><div>rofl</div></html>";
    2. public static HashSet<string> Tags = new HashSet<string>();
    3. static void Main(string[] args)
    4. {
    5. HTML += ";";
    6. Tags.Add("html");
    7. Tags.Add("p");
    8. Tags.Add("div");
    9. DOMObject dom = new DOMObject();
    10. dom.Process(false);
    11. Console.Read();
    12. }


    Ergibt:
    DOM -> HTML
    ............-> p {<hr>, HELLO, <hr>}
    ............-> div {rofl, <p>}
    ....................-> p{x}

    Ist sicher auch schneller denn: Technisch gesehen wird hier durchweg nur ein einzige Schleife verwendet (die obige Variante nutzte zig).


    Wer's braucht, hat's jetzt.

    Addendum:
    Jap, hab's getestet. Scheint mehr oder weniger zu funktionieren und das echt schnell.

    Addendum II:
    Der Code hat ein Bug, lässt sich aber _ relativ schnell korrigieren. Wer's wissen will mag mich anschreiben.
    _
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „φConst“ ()