Wir split ich schlau diese ListeOf string in ModelFamilie und ModelName

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Wir split ich schlau diese ListeOf string in ModelFamilie und ModelName

    Moin,

    ich knoble schon länger an diesem Problem rum und komme nicht so richtig auf eine saubere Lösung. Ich würde gerne Listen dieser Art:
    (wobei jede Zeile einen String darstellt)
    ------------------------------------------
    Button MD4
    Button MD5
    Style AQ LX R3
    Style AQ LX Read 4
    Style AQ Score3
    Style AQ R9
    Style Mach1
    Style Mach4*
    Regan Muster11
    Rower 123 A1
    Rower 123 B2
    Rower 123 C4
    Tao Tao
    ------------------------------------------

    in folgendes KlassenModel übersetzen:

    ModelFamily // ModelName

    Button
    MD4
    Button
    MD5
    Style AQ LX
    R3
    Style AQ LX
    Read 4
    Style AQ
    Score3
    Style AQ
    R9
    Style
    Mach1
    Style
    Mach4*
    Regan
    Muster11
    Rower 123
    A1
    Rower 123
    B2
    Rower 123
    C4
    Tao
    Tao


    Was für eine Schleifenlogik trennt mir das richtig (die Ausgangsliste, die ich parsen will, ist im Urspung schon nach ModelFamily gruppiert)?

    Versteige ich mich bei mein Lösungsansatz in unnötige Tiefen oder ist das einfach so komplex?

    Spoiler anzeigen

    Erste, letzte String-Zeile erstmal ausgenommen.

    Ich verfolge die Idee jede String Zeile nach den Leerzeichen nochmal in eine ListeOf String zu splitten.

    Dann vergleiche ich das erste Wort der Liste mit dem ersten Wort der nächsten und der vorhergehenden Zeile falls da mindestens eine Übereinstimmung herrscht, adde ich dieses Wort zum ModelFamily-String bis dann keine Übereinstimmung mehr herrscht -> fertiger ModelFamilyName.

    Falls oben und unten keine Übereinstimmung herrscht hat diese ModelFamily nur ein Model.

    Dazu dann noch die ganze umständliche Logik erste und letzte Zeile abfangen. Sonderfall da die ja keinen Vorgänger Nachfolger haben... .
    Muss ich mich da einfach "durchdebuggen" oder gibt es da was schlaueres (super dupper Regex pattern)?

    e.g.:

    Style AQ LX R3
    Style AQ LX Read 4 -------------> "Style","AQ","LX" => FamilyModelName "Style AQ LX"
    Style AQ Score3


    Ich poste später mal Code falls ich da was gescheites zum Laufen bekomme.
    codewars.com Rank: 4 kyu
    Man kann auf diese Liste einen "Baum-Builder-Algo" anwenden. (genauer: "Forest-Builder", denn es entstehen mehrere Bäume)
    Also die Zeilen als Space-getrennte Pfade auffassen, ähnlich den Pfaden, mit denen Dateien addressiert werden.
    Die TopLevel-Nodes so eines Baumes und die Nodes, die mehrere ChildNodes haben - das wären dann die ModelNames.

    Ich muss mal gucken, wo ich meine BaumBuilder-Codes habe.

    Ansonsten gehts auch so, wie du das ausgedacht hast, und so oder so ist das algorithmisch eine herausforderung.
    Gegenfrage: Kannst Du die Stringlistenerstellung nicht einfach verbessern/abwandeln?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ErfinderDesRades
    ... und so oder so ist das algorithmisch eine herausforderung.
    Genau das beführchtete ich. Ich bekomme einen "Knoten" im Gehirn und debugge mich Stunde um Stunde durch die ganzen if then ... Hoffendlich bin ich da schon besser geworden und brauch nicht mehr so lange wie früher für so eine Stelle.

    @VaporiZed Mir fällt keine bessere Möglichkeit ein das zu umgehen. Ich scrape mir Html-QuellCode und parse die TableCell Strings "raus". Ein TableCell-String ist: "HerstellerName + ModelFamilie + ModelName".
    Klar den Herstellernamen kann ich easy löschen da der immer gleich ist pro Table. Aber Model und Familie sind immer "anders" siehe in etwas die Liste oben.
    Eine Möglichkeit wäre fast gewesen alles <h3> ... </3> Überschriften der Table als FamilyModelNamen zu nehmen. Leider ist die Webseite da inkonsistent (h3-Tag fehlt häufiger mal oder wird auch mal als <img> Tag versehen Symbolbild der Familie ohne Name). Die Tables haben leider generische Header wie z.B. "Name", "Preis", ...
    codewars.com Rank: 4 kyu
    Hier habich was, was Dateipfade in einen treeview einliest. Baumstruktur im Treeview-Steuerelement erstellen
    Genauso müssen deine Pfade eingelesen werden, nur Pfad-Separator ist bei dir " ", nicht "\".

    Obwohl das vlt. nicht supercool ist einen Treeview zu missbrauchen aber erstmal wayne



    Andere Frage: Wo kommen diese doofe Liste denn her? Also wenn da jemand so gnädig gewesen wäre, mw. 2 Spaces zwischen Model und Typ zu machen, oder einen Tab - schon würde sich dein lausiges Problem in Luft auflösen.
    Vielleicht gibts ja noch Roh-Daten, wo derlei Info noch enthalten?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades So wie ich das bis jetzt gesehen habe, ist es leider so, dass "nur" ein Whitespace/Leerzeichen die Trennung ist.

    Ich versuch erstmal mit meinem Ansatz weiter zu kommen. Fall es damit nicht klappt, versuche ich mich mal in deinen Ansatz ein zudenken. Wäre, wie so oft, dann wieder ein ganz neues Thema für mich (also auch schwer).
    Danke an Euch beide :)
    codewars.com Rank: 4 kyu
    @PadreSperanza Guten Morgen :) Dictionary sind doch Key Value Paare, richtig? Die "Aufbewahrung" und der Wiederaufruf sind nicht so mein Problem.
    Meine Schwierigkeit liegt darin, dass ich aus einen gesamt String erstmal intelligent zum einen die Produktfamilie und dann in Abgrenzung dazu den Produktnamen trennen will (automatisch halt und nicht per Hand).

    Das Aufteilen ist das Problem. Wie ich gestern noch geschrieben habe denke ich liegt die Lösung in dem richtigen Filtern mit regex / split etc. und eben noch ein bisschen sortier if's. Gestern hab ich mich da ein bisschen eingelesen.
    codewars.com Rank: 4 kyu
    Andere Frage: Wenn Du die Model Family Names hast, warum nicht einfach:

    VB.NET-Quellcode

    1. For Each ModelFamilyName In ModelFamilyNames
    2. If RawTextLine.StartsWith(ModelFamilyName) Then ModelName = RawTextLine.SubString(ModelName.Length).Trim
    3. '…
    4. Next

    Müsstest Du nur die ModelFamilyNames so sortieren, dass die mit den spezifischeren Namen weiter oben stehen. Sonst wird Style AQ angenommen, obwohl Style AQ LX korrekt ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Nein ich hab nur einen GesamtString der eben so aufgebaut ist "MusterHersteller MusterModelFamilien MusterModelName".

    Also so was wie "Mercedes Benz A Klasse A 100" Hersteller rauslösen ist geklärt also bleibt "A Klasse A 100"
    und nun kommt die Schwierigkeit "A" = Family oder doch "A Klasse" oder "A Klasse A" ...

    Ich hab mich jetzt erstmal entschieden das so zu lösen, dass ich "einfach" das erste vollständige Wort nach dem Hersteller als ModelFamilie annehme, auch wenn das nicht zu 100% richtigen Ergebnissen führt, ich lass das erstmal so.
    Lg
    codewars.com Rank: 4 kyu
    Also, wenn Du gar keine Referenz hast, dann geht das m.E. gar nicht. Denn "Lorem ipsum dolo sic est romus": Wie soll man da ohne Referenz rausbekommen, was da was ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ich hab mal deine daten aus post1 in eine Datatable gepackt
    und sortiert

    was/wie du mit RegEx prüfen willst raff ich nicht

    VB.NET-Quellcode

    1. Public Class ModelFamily
    2. Dim tb As DataTable = New DataTable
    3. Private Sub ModelFamily_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. tb.Columns.Add("ModelFamily")
    5. tb.Columns.Add("ModelName")
    6. tb.Rows.Add("Button", "MD4")
    7. tb.Rows.Add("Button", "MD5")
    8. tb.Rows.Add("Style AQ LX", "R3")
    9. tb.Rows.Add("Style AQ LX", "Read 4")
    10. tb.Rows.Add("Style AQ", "Score3")
    11. tb.Rows.Add("Style AQ", "R9")
    12. tb.Rows.Add("Style", "Mach1")
    13. tb.Rows.Add("Style", "Mach4")
    14. tb.Rows.Add("Regan", "Muster11")
    15. tb.Rows.Add("Rowar 123", "A1")
    16. tb.Rows.Add("Rowar 123", "B2")
    17. tb.Rows.Add("Rowar 123", "C4")
    18. tb.Rows.Add("Tao", "Tao")
    19. 'ein paar mehr zum Test
    20. tb.Rows.Add("Button", "MD5")
    21. tb.Rows.Add("Style AQ LX", "Read 4")
    22. DataGridView1.DataSource = tb
    23. DataGridView1.AllowUserToAddRows = False
    24. End Sub
    25. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    26. Dim ModelIDs As New List(Of String)
    27. For Each row As DataGridViewRow In DataGridView1.Rows
    28. If (Not ModelIDs.Contains(row.Cells("ModelFamily").Value)) Then
    29. ModelIDs.Add(row.Cells("ModelFamily").Value)
    30. End If
    31. Next
    32. For Each Model_ID As String In ModelIDs
    33. Dim s1 As New Dictionary(Of String, Integer)()
    34. For Each row As DataGridViewRow In DataGridView1.Rows
    35. If row.Cells("ModelFamily").Value = Model_ID Then
    36. If Not s1.ContainsKey(row.Cells("ModelName").Value) Then
    37. s1.Add(row.Cells("ModelName").Value, 0)
    38. End If
    39. s1(row.Cells("ModelName").Value) += 1
    40. End If
    41. Next
    42. Debug.WriteLine("ModelFamily:<" & Model_ID & ">")
    43. For Each s2 As KeyValuePair(Of String, Integer) In s1
    44. Debug.WriteLine(String.Format("{0} x {1} ", s2.Value, s2.Key))
    45. Next
    46. Debug.WriteLine("---------------")
    47. Next
    48. End Sub
    49. End Class



    Debug output

    VB.NET-Quellcode

    1. ModelFamily:<Button>
    2. 1 x MD4
    3. 2 x MD5
    4. ---------------
    5. ModelFamily:<Style AQ LX>
    6. 1 x R3
    7. 2 x Read 4
    8. ---------------
    9. ModelFamily:<Style AQ>
    10. 1 x Score3
    11. 1 x R9
    12. ---------------
    13. ModelFamily:<Style>
    14. 1 x Mach1
    15. 1 x Mach4
    16. ---------------
    17. ModelFamily:<Regan>
    18. 1 x Muster11
    19. ---------------
    20. ModelFamily:<Rowar 123>
    21. 1 x A1
    22. 1 x B2
    23. 1 x C4
    24. ---------------
    25. ModelFamily:<Tao>
    26. 1 x Tao
    27. ---------------


    oder split nach dem ersten wort, würde dann so aussehen

    VB.NET-Quellcode

    1. Public Class ModelFamily
    2. Dim tb As DataTable = New DataTable
    3. Private Sub ModelFamily_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. tb.Columns.Add("ModelFamily")
    5. tb.Columns.Add("ModelName")
    6. 'tb.Rows.Add("Button", "MD4")
    7. 'tb.Rows.Add("Button", "MD5")
    8. 'tb.Rows.Add("Style AQ LX", "R3")
    9. 'tb.Rows.Add("Style AQ LX", "Read 4")
    10. 'tb.Rows.Add("Style AQ", "Score3")
    11. 'tb.Rows.Add("Style AQ", "R9")
    12. 'tb.Rows.Add("Style", "Mach1")
    13. 'tb.Rows.Add("Style", "Mach4")
    14. 'tb.Rows.Add("Regan", "Muster11")
    15. 'tb.Rows.Add("Rowar 123", "A1")
    16. 'tb.Rows.Add("Rowar 123", "B2")
    17. 'tb.Rows.Add("Rowar 123", "C4")
    18. 'tb.Rows.Add("Tao", "Tao")
    19. ''ein paar mehr zum Test
    20. 'tb.Rows.Add("Button", "MD5")
    21. 'tb.Rows.Add("Style AQ LX", "Read 4")
    22. tb.Rows.Add("Button", "MD4")
    23. tb.Rows.Add("Button", "MD5")
    24. tb.Rows.Add("Style", "AQ LX R3")
    25. tb.Rows.Add("Style", "AQ LX Read 4")
    26. tb.Rows.Add("Style", "AQ Score3")
    27. tb.Rows.Add("Style", "AQ R9")
    28. tb.Rows.Add("Style", "Mach1")
    29. tb.Rows.Add("Style", "Mach4")
    30. tb.Rows.Add("Regan", "Muster11")
    31. tb.Rows.Add("Rowar", "123 A1")
    32. tb.Rows.Add("Rowar", "123 B2")
    33. tb.Rows.Add("Rowar", "123 C4")
    34. tb.Rows.Add("Tao", "Tao")
    35. 'ein paar mehr zum Test
    36. tb.Rows.Add("Button", "MD5")
    37. tb.Rows.Add("Style", "AQ LX Read 4")
    38. DataGridView1.DataSource = tb
    39. DataGridView1.AllowUserToAddRows = False
    40. End Sub
    41. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    42. Dim ModelIDs As New List(Of String)
    43. For Each row As DataGridViewRow In DataGridView1.Rows
    44. If (Not ModelIDs.Contains(row.Cells("ModelFamily").Value)) Then
    45. ModelIDs.Add(row.Cells("ModelFamily").Value)
    46. End If
    47. Next
    48. For Each Model_ID As String In ModelIDs
    49. Dim s1 As New Dictionary(Of String, Integer)()
    50. For Each row As DataGridViewRow In DataGridView1.Rows
    51. If row.Cells("ModelFamily").Value = Model_ID Then
    52. If Not s1.ContainsKey(row.Cells("ModelName").Value) Then
    53. s1.Add(row.Cells("ModelName").Value, 0)
    54. End If
    55. s1(row.Cells("ModelName").Value) += 1
    56. End If
    57. Next
    58. Debug.WriteLine("ModelFamily:<" & Model_ID & ">")
    59. For Each s2 As KeyValuePair(Of String, Integer) In s1
    60. Debug.WriteLine(String.Format("{0} x {1} ", s2.Value, s2.Key))
    61. Next
    62. Debug.WriteLine("---------------")
    63. Next
    64. End Sub
    65. End Class


    und resultat output

    VB.NET-Quellcode

    1. ModelFamily:<Button>
    2. 1 x MD4
    3. 2 x MD5
    4. ---------------
    5. ModelFamily:<Style>
    6. 1 x AQ LX R3
    7. 2 x AQ LX Read 4
    8. 1 x AQ Score3
    9. 1 x AQ R9
    10. 1 x Mach1
    11. 1 x Mach4
    12. ---------------
    13. ModelFamily:<Regan>
    14. 1 x Muster11
    15. ---------------
    16. ModelFamily:<Rowar>
    17. 1 x 123 A1
    18. 1 x 123 B2
    19. 1 x 123 C4
    20. ---------------
    21. ModelFamily:<Tao>
    22. 1 x Tao
    23. ---------------


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kasi“ ()

    Kasi schrieb:

    was/wie du mit RegEx prüfen willst raff ich nicht
    Er will eine Heuristik haben, die entscheiden kann, ob bei zB die Eingabe
    Style AQ LX Read 4
    Der ModelName Style lautet, Style AQ, Style AQ LX oder Style AQ LX Read.
    Alle 4 Varianten sind möglich, und der Datenbestand maht keine eindeutige Aussage, was richtig wäre.Bei deine DataTable hast du die Entscheidung gschwind selbst getroffen, aber das ist am Sinn des Threads vorbei.

    nogood schrieb:

    dass ich aus einen gesamt String erstmal intelligent zum einen die Produktfamilie und dann in Abgrenzung dazu den Produktnamen trennen will (automatisch halt und nicht per Hand).
    Vlt. bringt dich die Ähnlichkeiten von Wörtern zum Ziel...
    codeproject.com/Tips/859415/Le…Algorithm-in-Visual-Basic
    Vlt. hilft dir das...
    Meine Antwort bezog sich auch eher darauf, dass du jeweils eine Collection haben könntest und anhand der Key-Value-Pairs entscheiden kannst, in welche der Collections du das einbindest. Hat den Vorteil, dass du eine semantisch korrekte Trennung hättest und danach für jede ModelFamily machen kannst, was du mit ihr machen willst. Oder ich hab es falsch verstanden

    nogood schrieb:

    Ich bin nicht fertig, aber ich denke die Lösung verbirgt sich in einem geschickten RegexPattern.
    Ja, kann sein.
    Mit Regex könnte man zB als ModelName den Bereich vom Anfang letztes Wort bis ZeilenEnde identifizieren - ungeachtet, ob da noch Ziffern folgen.
    Wenn das eine gültige Definition ist, die auf alle Daten zutrifft, dann ist das wohl das einfachste.
    @nogood

    Bei solchen Stringszeugs arbeite ich gerne mit Indexes.

    Ich definiere mir zuerst eine ModelFamilieListe und Sortiere sie nach länge abwärts (Grösste Länge zuoberst).
    Dann mach ich mir eine ModelFamilyIndexListe in Kombination mit den Daten die du bekommen hast. Hat den Vorteil, dass du dich nicht mehr musst mit den ModelFamilies rumschlagen musst, da alle ModelFamily für jede Zeile schon bekannt ist.

    Sobald du die hast ist es eine Kleinigkeit die ModelNamen, die ModelFamilies (schon als Index vorhanden) oder beides zusammen Modelname und die dazu gehörende ModelFamily aus dem String zu etrahieren.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function ToModelFamily() As Dictionary(Of String, String)
    2. 'Die Prioritäten spiele keine Rolle, wenn die Liste sortiert wird
    3. Return New Dictionary(Of String, String) From
    4. {
    5. {"button", "Button"},
    6. {"style aq lx", "Style AQ LX"},'Höchste Priorität
    7. {"style aq", "Style AQ"},
    8. {"style", "Style"},'Niedrigste Priorität
    9. {"regan", "Regan"},
    10. {"rower 123", "Rower 123"},
    11. {"tao", "Tao"}
    12. }.OrderByDescending(Function(s) s.Key.Length).
    13. ToDictionary(Function(kv) kv.Key, Function(kv) kv.Value)
    14. End Function
    15. Private Function ToModelFamilyIndexes(data() As String) As Int32()
    16. Dim idx = 0
    17. Dim famlst = ModelFamily.Keys.ToList
    18. Dim result = Enumerable.Repeat(-1, data.Length).ToArray
    19. For i = 0 To data.Length - 1
    20. For j = 0 To famlst.Count - 1
    21. If data(i).ToLower.IndexOf(famlst(j)) = 0 Then
    22. result(idx) = j
    23. idx += 1
    24. Exit For
    25. End If
    26. Next
    27. Next
    28. Return result
    29. End Function

    Ist zwar eine eher uneffiziente Art, aber dafür funkst sie garantiert. Wenn dieses Grundprinzip hast, kannst dann die Überlegungen machen, wie man solche sachen mit z.B. Linq löst, dazu gibt es Action, Substring etc.

    Die Weg über Regex ist sicher irgendwie auch möglich, finde ich aber eher beschwerlich um die ModelFamilies exakt daraus zu extrahiern. Versuchen kann man's natürlich, und ein Lernerfolg ist sicher auch dabei.

    Bin auf jedenfall gespannt, wie du es schlussendlich löst.

    Freundliche Grüsse

    exc-jdbi
    Der Reihe nach:

    @VaporiZed Du hast ja irgendwie recht das das ganze hinkt (ohne Referenze Lorem...). Jedoch wenn man sich die Liste im ersten Post ansieht kann jeder Mensch doch ein Art Muster erkennen:
    "Button MD4", "Button MD5" -> Family=Button mit Modellen= MD4 und MD5 etc.
    Zu meinem Erfolg/Misserfolg später mehr.

    @Kasi Wooh das hat sicher Zeit und Mühe gekostet das alles zu programmieren und dann auch noch so sauber als Post zu verpacken. Dickes Danke dafür, auch wenn es nicht das ist was ich gesucht habe.

    @VB1963 Ich hab schon einen Ansatz der ich glaube der richtige ist Regex-Pattern etc. Danke für die Alternative

    @ErfinderDesRades wie geschrieben Regex ist glaub ich die richtige Richtung...

    @exc-jdbi Danke auch Dir für deinen Ansatz. Leider bin ich im Moment zu durchgerockt die Logik da zu verstehen. Ich schau mir das Listing morgen an :)

    So kurz zu meiner vermeintlichen Lösung. Ich pack den Code hier rein ohne Kommentare und Erklärungen. Wie gesagt mir qualmt noch der Kopf.



    Fazit
    Der Screenshot zeigt die Ausgangsliste und auf Knopfdruck werden die Möglichen ModelFamilienNamen angezeigt. Mit dieser Erkennung kann ich dann ja ModelName und ModelFamilie aus dem gesamt String rauslösen.
    Es funktioniert jedenfalls ein bisschen

    Problem:
    Ich hab den Code mit diversen anderen Listen getestet leider liefert meine Logik immer auch fehlerhafte Listen und einzel Einträge gehen nicht. Naja ein Teilerfolg erstmal...


    -------------
    Idee/Konzept des Codes:

    Lese jede Line Text ein teile jede Zeile nochmal in ein String Array
    (Button MD4) -> ("Button" "MD4")
    (Button MD5) -> ("Button" "MD5")
    (Style AQ LX R3) -> ("Style" "AQ" "LX" "R3")
    ...

    Davon erstelle ich dann ListOf ListOf Strings z.B:
    "Button" "Button MD4"
    ...
    "Style" "Style AQ" "Style AQ LX" "Style AQ LX R3"

    Ich erstelle auch eine ListOf String vom Gesamten Text wobei jeweils einmal jede Zeile nicht dabei ist.
    Gesamter Text ohne Zeile 1
    Gesamter Text ohne Zeile 2
    ...


    Ich will FamilyName für "Style AQ LX R3" automatisch definieren :

    In der ListOf Sting Aller Texte (aber ohne diese eine Zeile "Style AQ LX R3") schaue ich ob erst
    "Style" vorkommt wenn ja ist das der FamilyName temporär (da dieser String auch bei andern Einträgen drinsteht -> muss er zum ProduktFAmilienNamen gehören) und ich schaue ob nicht auch "Style AQ" bei anderen Einträgen vorkommt wenn ja ...usw... "Style AQ LX" (ja) "Style AQ LX R3"(nein) -> FamilyName für "Style AQ LX R3" ist "Style AQ LX"

    Danach noch List Distinct machen das keine doppelten Einträge da sind! Fertig.


    Für den sehr interessierten Leser mir freier Hinkapazität und einen Hang zum Masochismus:
    Spoiler anzeigen

    C#-Quellcode

    1. private void Btn1_Click(object sender, EventArgs e)
    2. {
    3. var lines = RtxbxShow1.Text.Split('\n');
    4. List<string> LstResultFamilyNames = new List<string>();
    5. //All Words all Lines in a List of MatchCollections
    6. List<List<String>> LstOfGrowingWordStrings = new List<List<string>>();
    7. foreach (var line in lines)
    8. {
    9. var matches = Regex.Matches(line, @"\b[\w-]+\b");
    10. List<string> GrowingLineWords = new List<string>();
    11. string gWord = "";
    12. for (int i = 0; i < matches.Count; i++)
    13. {
    14. gWord += matches[i]+ " ";
    15. GrowingLineWords.Add(gWord);
    16. }
    17. LstOfGrowingWordStrings.Add(GrowingLineWords);
    18. }
    19. List<string> LstAllTextMinusInspectionLine = new List<string>();
    20. //All Text without line0 the then all Text without line1 etc.
    21. for (int i = 0; i < lines.Length; i++)
    22. {
    23. List<string> orig = new List<string>();
    24. orig = lines.ToList();
    25. orig.RemoveAt(i);
    26. string textWithTheOneLine="";
    27. foreach (var l in orig)
    28. {
    29. textWithTheOneLine += l + " ";
    30. }
    31. LstAllTextMinusInspectionLine.Add(textWithTheOneLine);
    32. }
    33. string finalFName="";
    34. for (int i = 0; i < lines.Length; i++)
    35. {
    36. foreach (var gw in LstOfGrowingWordStrings[i])
    37. {
    38. if (Regex.IsMatch(LstAllTextMinusInspectionLine[i], gw))
    39. {
    40. finalFName = gw;
    41. }
    42. }
    43. LstResultFamilyNames.Add(finalFName);
    44. }
    45. LstResultFamilyNames = LstResultFamilyNames.Distinct().ToList();
    46. foreach (var fname in LstResultFamilyNames)
    47. {
    48. RtxbxShow2.Text += fname + "\n";
    49. }
    50. }​


    Bilder
    • Bild_2020-12-14_005854.png

      21,75 kB, 465×577, 35 mal angesehen
    codewars.com Rank: 4 kyu