2 Stimmen

Klassenstruktur für die vorgeschlagenen Daten und ihre Container?

Zuerst möchte ich allen, die dies lesen, ein frohes neues Jahr wünschen :)

Ich habe Schwierigkeiten, wie man einen Container für einige Daten, die ich in meine Anwendung importieren zu machen, und ich bin nicht sicher, wie man dies sehr gut zu erklären und mein Englisch ist nicht wirklich ein, dass gut, so ich hoffe, Sie können mit meinem Fehler zu tragen und helfen Sie mir mit einigen Leitlinien.

Derzeit importiere ich mit einem foreach die folgenden Felder aus den empfangenen Daten: guid, itemid, name, owner(optional, kann null sein), zoneid, titleid, subid, heading, x, y, z, typeA, typeB, typeC

Aus den oben genannten Feldern muss ich eine Wegpunktliste mit allen Koordinaten speichern, zu denen sich ein bestimmtes Element bewegt hat, ABER für jede Guid habe ich eine neue Liste von Wegpunkten.

Und von der Wegpunktliste ist der erste Eintrag auch meine anfängliche Element-Startposition, die meine Element-Ausgangsposition sein würde (wenn Sie bemerken, habe ich eine separate Liste für sie, die ich nicht sicher war, wäre besser oder nicht) nicht alle Elemente haben eine Wegpunktliste, aber alle Elemente haben die erste Position.

Also die erste Idee, die ich kam mit, um diese Daten zu speichern war eine Liste mit einer Klasse mit 2 inneren Klassen mit ihrer Liste:

public List<ItemList> myList = new List<ItemList>();
public class ItemList
{
    public int GuID { get; set; }
    public int ItemID { get; set; }
    public string Name { get; set; }
    public int TitleID { get; set; }
    public itemType Status { get; set; }

    public class Waypoint
    {
        public int Zone { get; set; }
        public int SubID { get; set; }
        public int Heading { get; set; }
        public float PosX { get; set; }
        public float PosY { get; set; }
        public float PosZ { get; set; }
    }
    public List<Waypoint> Routes = new List<Waypoint>();
}

Hier ist ein Beispiel, wie ich einen neuen Wegpunkt zu einer GUID hinzufügen würde, die in der Liste existiert

                    ItemList myItem = myList.Find(item => item.GuID == GUID);
                    if (myItem != null)
                    {
                        int lastDistance = 3;
                        ItemList.Waypoint nextWaypoint;

                            // Add new Coordinates to the given GUID
                            ItemList.Waypoint lastWaypoint = myItem.Routes.LastOrDefault();
                            if (lastWaypoint != null)
                            {
                                lastDistance = getDistance(posX, posY, posZ, lastWaypoint.PosX, lastWaypoint.PosY, lastWaypoint.PosZ);
                                if (lastDistance > 2)
                                {
                                    nextWaypoint = new ItemList.Waypoint();
                                    nextWaypoint.SubID = subID;
                                    nextWaypoint.Zone = zone;
                                    nextWaypoint.Heading = convertHeading(heading);
                                    nextWaypoint.PosX = posX;
                                    nextWaypoint.PosY = posY;
                                    nextWaypoint.PosZ = posZ;
                                    nextWaypoint.Rest = rest;
                                    myItem.waypoint.Add(nextWaypoint);
                                }
                            }
                    }

Dann, um ein neues Element zu registrieren, würde ich die Vorteile der itemExist oben nehmen, so dass ich nicht die gleiche GUID wieder registrieren:

                    ItemList newItem = new ItemList();
                    newItem.GuID = GUID;
                    newItem.ItemID = itemID;
                    newItem.Name = name;
                    newItem.Status = status;
                    newItem.TitleID = titleID;

                    // Item location
                    ItemList.Location itemLocation = new ItemList.Location();
                    itemLocation.SubID = subID;
                    itemLocation.Zone= zone;
                    itemLocation.Heading = convertHeading(heading);
                    itemLocation.PosX = posX;
                    itemLocation.PosY = posY;
                    itemLocation.PosZ = posZ;
                    newItem.position.Add(itemLocation);
                    myList.Add(newItem);

Könnten Sie mir mit Ratschlägen helfen, wie meine Klassenstruktur und Listen aussehen sollten?

Gibt es bessere Möglichkeiten, mit den Listen zu interagieren, um den letzten Wegpunkt einer GUID zu erhalten oder zu überprüfen, ob ein Element vorhanden ist oder nicht?

Was würden Sie mir sonst noch allgemein raten?

PS: Wenn Sie Fragen haben oder ich etwas vergessen habe, lassen Sie es mich bitte wissen und ich werde es aktualisieren.

UPDATE: habe die oben genannten geändert, um zu reflektieren, was ich derzeit habe, und wenn jemand anderes noch Ratschläge hat, würde ich gerne hören.

1voto

Ondrej Tucny Punkte 26742

Ein paar Anmerkungen (nach zwei Gläsern Champagner ):

  • Sie machen keine Angaben zu den Anforderungen an die Datenstrukturen und deren Verwendung. Ihr Entwurf sieht recht vernünftig aus.
  • Sie können die FirstOrDefault() Methode, um die Existenz zu prüfen (d.h. der Rückgabewert != null ) eines Eintrags und rufen ihn in einem Arbeitsgang aus der Liste ab.
  • Ihr Code hat einen offensichtlichen Fehler: Es gibt keine nextWaypoint != null prüfen, bevor der neue Wegpunkt hinzugefügt wird, und er muss nicht existieren. Ebenso darf es keine lastWaypoint != null Prüfung erforderlich, da die Liste keine Nullwerte enthalten wird.
  • Ich würde empfehlen, Konstruktoren für Ihre Klassen einzuführen, die Werte für die obligatorischen Eigenschaften akzeptieren.
  • Es ist nicht sinnvoll, sowohl eine GUID als auch eine Integer-ID zu haben, die die ItemList - dann ist die Suchbedingung einfach überspezifiziert.
  • Der allgemein gebräuchliche Kodierungsstandard besagt, dass Eigenschaftsnamen mit einem Großbuchstaben beginnen müssen ( posX PosX usw.).
  • En waypoint y position Listen sollten ebenfalls Eigenschaften sein, die nur einen Getter haben und mit einem Readonly-Feld versehen sind.

P.S. Frohes neues Jahr, sobald es in Ihre Zeitzone kommt und viel guten Code in 2011 ;-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X