Hermetes Geschrieben 19. Januar 2019 Melden Share Geschrieben 19. Januar 2019 Hallo! Duplikate zusammen zu zählen kann man wohl über IndexOf ermöglichen. Allerdings habe ich echt seltsame Resultate. Mein Script mit Erklärung public class SlotInventoryItem : MonoBehaviour public InventoryItem ip; void Update() { if (ReferenceManager.instance.activeStore != null) activeInventory = ReferenceManager.instance.activeStore.GetComponent<MainStoreInventory>(); //das angeklickte Lager amount = activeInventory.storedItems.IndexOf(ip); // die Liste nennt sich storedItems. Das zu vergleichende Item ist das Inventoryitem genannt ip. Mein Debug: Anzahl des Items Stein ist : 2 Anzahl des Items Hammer ist : -1 Anzahl des Items Holz ist : 0 Tatsächlich in der Liste sind 3 x Stein , 0 x Hammer, 2x Holz. Habe nachgelesen das wenn nichts gefunden -1 ausgegeben wird. Aber weshalb beim Stein - 1? und beim Holz -2 ? Wenn ich das in einer foreach Schleife sausen lasse , kommt bei jedem Item 2 heraus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 19. Januar 2019 Melden Share Geschrieben 19. Januar 2019 vor 4 Stunden schrieb Hermetes: Duplikate zusammen zu zählen kann man wohl über IndexOf ermöglichen. Du hast IndexOf falsch verstanden. Wie der Name sagt, gibt es dir den (ersten) Index des Elements zurück. Wenn du also [Apfel, Apfel, Birne] hast gibt dir IndexOf(Apfel) 0 zurück und IndexOf(Birne) 2. Ist ein Element gar nicht vorhanden, wird -1 zurückgegeben, da 0 ja heißen würde, dass das Element an erster Stelle steht. Ist denn die Reihenfolge der Items in deinem Inventar überhaupt wichtig? Also - ist es wichtig dass du [Apfel, Birne, Apfel] hast oder wäre 2 Äpfel, 1 Birne auch in Ordnung? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 19. Januar 2019 Autor Melden Share Geschrieben 19. Januar 2019 Achso, mit IndexOf kann ich nur die Position der Liste herausfinden! Mir gehts echt nur um die Anzahl eines bestimmten Items innerhalb der Liste. Also 2 Äpfel , 1 Birne . Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 19. Januar 2019 Autor Melden Share Geschrieben 19. Januar 2019 Position innerhalb der Liste meinte ich. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 19. Januar 2019 Melden Share Geschrieben 19. Januar 2019 In diesem Fall solltest du keine Liste benutzen, sondern ein Dictionary. Ein Dictionary ist ein Datentyp, bei dem ein Wert zu einem Schlüssel zugewiesen werden. Typ von Schlüssel und Wert kannst du dir aussuchen. Es erlaubt dir, den Schlüssel hineinzustecken und den entsprechenden Wert herauszubekommen. Du definierst es so: Dictionary<TKey, TValue> wobei TKey der Typ des Schlüssels und TValue der Typ des Wertes ist. Da der Typ deines Items "InventoryItem" ist und der Wert eine Zahl (die Anzahl) sein soll, muss das so aussehen: Dictionary<InventoryItem, int> storedItems = new Dictionary<InventoryItem, int>(); So fragst du die Anzahl ab: storedItems[ip] // z.B. Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); Gleichermaßen kannst du die Anzahl setzen: storedItems[ip] = 100; Wenn du ein Item anfragen willst, das aber gar nicht in der Liste ist, dann kracht es. Deshalb gibt es TryGetValue, falls du dir nicht sicher sein kannst: int amount; if (storedItems.TryGetValue(ip, out amount)) { // Es gibt dieses Item im Dictionary Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); } else { Debug.Log("Ich habe kein " + ip + " in meinem Inventar"); } Auf diese Weise kannst du auch Dinge hinzufügen oder wegnehmen: public void ChangeAmount(InventoryItem item, int changeAmount) { int currentAmount; if (storedItems.TryGetValue(item, out currentAmount)) { // Das Item gibt's schon im Inventar var newAmount = currentAmount + changeAmount; if (newAmount > 0) { // Ändere die Anzahö storedItems[item] = newAmount; } else { // Lösche das Item aus dem Inventar storedItems.Remove(item); } } else { // Das Item ist noch nicht im Inventar if (changeAmount > 0) { // Füge das Item in das Inventar hinzu storedItems.Add(item, changeAmount); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Lightstorm Geschrieben 19. Januar 2019 Melden Share Geschrieben 19. Januar 2019 Du könntest die Liste in einer foreach Schleife durchgehen und zählen wie oft ein bestimmtes Element auftaucht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 20. Januar 2019 Melden Share Geschrieben 20. Januar 2019 Du kannst auch eine Suppe mit einer Gabel essen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 20. Januar 2019 Autor Melden Share Geschrieben 20. Januar 2019 Hab mich heute Morgen gleich ans Werk gemacht und läuft echt gut! Dann steckt die Anzahl bereits im [ip] drin. Versuchte die ganze Zeit auf storedItems[ip].keyValue zuzugreifen. Das Dictionary vereint das Item mit der Anzahl zu einer Gruppe. So wie Mutter und Kind. InventoryItem wäre die Mutter und das integer das Kind. Die Gruppe wäre Alleinerziehende bzw. Familie. Alles in der Klammer [] heisst dann [Mutter hat ein Kind] . storedItems[ip]++ bedeutet [Mutter hat zwei Kinder]. storedItems.Add[ip] Frau gebährt Kind --> Gruppe entsteht. storedItems.Remove[ip] Kind Tod! 😭 Auch interessant das du nur eine Methode für Add und Rmove verwendet hast. Vielen Dank Sascha!!! @Lightstorm . Habe das ja jetzt gut hinbekommen. Mich interessiert es aber auch wie man doppelte Einträge in der Liste zusammenzählt. Mir fällt nur ein Vergleich zwischen item.name ein. Also mit Strings. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Lightstorm Geschrieben 20. Januar 2019 Melden Share Geschrieben 20. Januar 2019 vor 15 Minuten schrieb Hermetes: @Lightstorm . Habe das ja jetzt gut hinbekommen. Mich interessiert es aber auch wie man doppelte Einträge in der Liste zusammenzählt. Mir fällt nur ein Vergleich zwischen item.name ein. Also mit Strings. Ja du könntest die Namen Vergleichen. Wenn du nur wissen willst ob es überhaupt doppelte Einträge in einer Liste gibt kannst Distinct nutzen: if(list.Count != list.Distinct().Count) { //doppelte Einträge vorhanden } Distinct entfernt doppelte Einträge von der Liste. Mit LINQ kann man auch komplexere Abfragen erzeugen, kenne mich damit aber nicht aus. Hier: https://stackoverflow.com/questions/18547354/c-sharp-linq-find-duplicates-in-list Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 20. Januar 2019 Autor Melden Share Geschrieben 20. Januar 2019 Bin immer wieder überrascht welche Methoden die List bereitstellt. Distinct kannte ich bisher nicht. Danke Dir! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.