Jump to content
Unity Insider Forum

Anzahl eines Items aus einer Liste bestimmen


Hermetes

Recommended Posts

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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...