Doppelte Einträge in einer Unterklasse von einer Klasse auslesen

  • C#

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Annoxoli.

    Doppelte Einträge in einer Unterklasse von einer Klasse auslesen

    Hallo,

    derzeit stehe ich vor einem kleinem Denkproblem.
    Ich habe eine Liste, in der Namen eingespeichert sind.
    (Beispiel: Max, Müller, Muster, Mann) (eine Klasse "Personen")
    die Klasse "Personen" besitzt eine Unterklasse mit dem Namen "Kennzeichen".

    Nun möchte ich gerne, von jedem einzelnen Nutzer, die Kennzeichen Überprüfen.
    Die Schwierigkeit ist, dass ich gerne die Doppelten Kennzeichen sagen wir mal von "B-AA-1234" auf "B-AA-1235" ändere,
    und diese dann auch übernimmt.

    Mein Gedanken Ansatz war, dass ich mit einer Foreach Schleife jede Person, in Klasse "Personen" durchgehe,
    dann wiederum erneut eine Foreach Schleife durchführe, um die Liste in Personen -> Kennzeichen durchzugehen,
    da wiederum eine gleiche schleife mit dem obrigen durchgehe, jedoch bekomme ich nicht mal ansatzweise das
    Result, was ich benötige.

    Ich kann leider nicht direkt beim Datenbezug die Informationen überprüfen, da die von einem anderen
    System so vorgegeben sind.

    Gehe ich das ganze vom Gedankenansatz falsch an? Hat jemand
    ggf eine Idee, wie ich mein Problem zu löse?

    Gruß, Annoxoli
    Du verrätst uns zwar nichts über deine Klassen, aber den Ansatz mit doppelten Einträge kann man zB. mit einem HashSet<t> umsetzen.

    C#-Quellcode

    1. public IEnumerable<String> DoppelteElemente(IEnumerable<String> kz)
    2. {
    3. HashSet<String> kennzeichen = new HashSet<String>();
    4. foreach (String k in kennzeichen)
    5. {
    6. if (!kennzeichen.Add(k))
    7. yield return k;
    8. }
    9. }


    Die Auflistung im Rückgabewert enthält dann alles, was mehrmals vorkommt. Wenn 3 mal das selbe Kennzeichen vorkommt, ists zwei mal im Rückgabewert.
    Ich denk, du solltest dich präziser ausdrücken.

    Annoxoli schrieb:

    die Klasse "Personen" besitzt eine Unterklasse mit dem Namen "Kennzeichen".
    Vermutlich meinst du, dass die Klasse Person eine Property Kennzeichen As String hat - richtig?

    Was ist damit gemeint:

    Annoxoli schrieb:

    dass ich gerne die Doppelten Kennzeichen sagen wir mal von "B-AA-1234" auf "B-AA-1235" ändere
    Ich sehe da kein doppeltes Kennzeichen ?(

    Das hier verstehe ich überhaupt nicht.

    Annoxoli schrieb:

    Mein Gedanken Ansatz war, dass ich mit einer Foreach Schleife jede Person, in Klasse "Personen" durchgehe,
    dann wiederum erneut eine Foreach Schleife durchführe, um die Liste in Personen -> Kennzeichen durchzugehen,
    da wiederum eine gleiche schleife mit dem obrigen durchgehe, jedoch bekomme ich nicht mal ansatzweise das
    Result, was ich benötige.
    wie jetzt - gibt es neben der Klasse Person auch eine Klasse Personen?
    Eine Klasse kann man nicht mit Foreach durchlaufen, man kann nur Auflistungen durchlaufen, genau: Man kann nur Objekte durchlaufen, die vom Datentyp her eine Auflistung sind.
    Und was bedeutet "Liste in Personen -> Kennzeichen durchzugehen"?

    Also ich kann mir vorstellen, es gibt eine Auflistung von Person-Objekten, mit je einer Kennzeichen - Property, und das Problem sei, dass verschiedene Personen denselben Wert als Kennzeichen aufweisen.
    Und du suchst einen Algo, mit dem du mehrfach auftretende Kennzeichen auffindest, und abänderst, damit die Kennzeichen eindeutig werden.
    Richtig?

    (Ist wichtig, dass du die Frage klar beantwortest, denn sonst weiß ich nicht (und vmtl. auch niemand sonst), was wirklich die Problemstellung ist.)
    Also entweder
    Richtig - ja
    oder
    Richtig - nein, sondern...
    @ErfinderDesRades

    Ist tatsächlich etwas verwirrend...

    Also, ich habe eben eine Beispiel Klasse geschrieben:

    C#-Quellcode

    1. public class Personen
    2. {
    3. public String Name;
    4. public Int32 Alter;
    5. public List<CFahrzeuge> Fahrzeuge;
    6. }
    7. public class CFahrzeuge
    8. {
    9. public String FahrzeugName;
    10. public List<CKennzeichen> Kennzeichen;
    11. public class CKennzeichen
    12. {
    13. public String Kennzeichen;
    14. }
    15. }


    Ich habe also eine Liste von Personen.
    Diese Personen besitzen eine Liste von Fahrzeugen.
    Die Fahrzeuge hingegen besitzen eine Liste von Kennzeichen.

    Und die Doppelten Kennzeichen muss ich quasie Rausfiltern,
    und der jeweiligen Person, bzw dessen Fahrzeug(e) ändern.

    Letztendlich ist es in Wirklichkeit wesentlich größer,
    jedoch kann/darf ich nicht den Sourcecode 1:1 kopieren.
    Diese "Fake-Klasse" spiegelt aber exakt mein Problem wieder.


    @Counterbug
    Hilft mir Aktuell NOCH nicht weiter.

    Annoxoli schrieb:

    C#-Quellcode

    1. CFahrzeuge

    Annoxoli schrieb:

    C#-Quellcode

    1. CKennzeichen
    Die C++-Zeiten sind doch hier vorbei.
    Klassennamen haben unter .NET kein führendes "C" mehr.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also prinzipiell ist das Problem recht einfach lösbar, etwa mithilfe eines Hashsets(Of String)

    Dazu muss aber definiert sein, wann 2 Kennzeichen gleich sind.
    Und das ist im Sample wieder verwirrend, denn die Klasse Personen enthält genau eine Person - bzw. enthält sie nicht, sondern stellt sie dar.
    Enthalten tut sie aber viele CFahrzeuge.
    Und jedes CFahrzeuge wiederum viele CKennzeichen
    Und ein CKennzeichen hat ein Kennzeichen As String-Feld (keine Property)

    sollen etwa von allen Personen alle CFahrzeuge gesammelt werden, von diesen wiederum alle CKennzeichen?
    Und sollen von diesen gesammelten CKennzeichen die Kennzeichen-Felder eindeutig gemacht werden?

    ErfinderDesRades schrieb:

    sollen etwa von allen Personen alle CFahrzeuge gesammelt werden, von diesen wiederum alle CKennzeichen?
    Und sollen von diesen gesammelten CKennzeichen die Kennzeichen-Felder eindeutig gemacht werden?


    korrekt

    @RodFromGermany:
    Ist eine Angewohnheit Klassen mit "C" zu taggen, letztendlich ist es dadurch übersichtlicher bei größeren Projekten.
    Also dadurch reduziert sich das Problem einzig auf die Veränderung von Strings des Formats l-ll-dddd(l: Letter, d: Digit
    Ist das überhaupt das tatsächliche Format, oder ist dieses Format nur ein Beispiel?

    Angenommen, man zählt die Digits einfach hoch - was wird aus diesem Kennzeichen: A-AA-9999?
    Wie gesagt - ist kein Problem, das Zeugs mit verschachtelten Foreach zu durchlaufen, und die Kenzeichen-Strings zu verändern.
    Und das Ignorieren meiner 2. Frage verstehe ich so, dass es auch nix ausmacht, wenn dabei ein Kennzeichen-String länger wird: Es würde dann ja aus A-AA-9999 A-AA-10000 würde.

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

    Ich glaube, das ganze ist auch nicht an der Wirklichkeit orientiert.

    Klar kann eine Person mehrere Fahrzeuge haben. Aber ein Fahrzeug kann niemals mehr als ein Kennzeichen haben. In keinem Land der Welt.
    Aber: Ein Kennzeichen kann an mehrere Fahrzeuge vergeben werden (sog. Wechselkennzeichen). Diese Fahrzeuge gehören dann aber immer zu einer Person.

    Somit genügt ein einfacher Test aller Kennzeichen auf Duplizität plus Test, ob gleiche Person.
    @OlafSt
    Das ist so nicht richtig, zum mindestens bezogen auf mein Problem.
    Das was ich hier als Beispiel gegeben habe, soll letztendlich nur mein Problem, auf einen anderen Bereich darstellen.
    (wenn du die ganzen Beiträge mal etwas verfolgt hättest) - so direkt bezogen auf Kennzeichen, sollte so was nicht auftreten, da hast du recht :P
    Also erstell du einen Code, der solche Personen generiert, inklusive doppelt vorkommender Kennzeichen, und ich mach den Algo, der die Kennzeichen dann einzigartig macht, ok?

    Weil wenn ich selbst den Code bastel, der solche komischen Personen produziert, und die Lösung dazu - da hätte ich Zweifel, dass du die Lösung überhaupt auf dein reales Prob wirst übertragen können.
    Ich habe es mittlerweile geschafft.
    Ich habe eine Lokale Variable mit dem Inhalten der Fahrzeuge genommen,
    übergebe den einer Funktion, samt der Liste der vorhandenen Personen,
    und gehe dann mit einer verschachtelten Schleife alles durch.
    Das Resultat ist exakt das was ich haben wollte.