2016-08-07 37 views
2

Gesucht viel, aber ich kann das nicht herausfinden. Ich habe eine Klassenrüstung mit ein paar Eigenschaften. Ich kann es hinzufügen, und ich mache es über die Funktion, die auch Sortierung hinzufügt.Wie aus der Generischen Liste ein Element basierend auf der Klasse mit Konstruktor entfernen?

Ich habe Klasse Item:

public class Item : IComparable<Item> 
{ 
    public string name, description; 
    public bool stackable; 
    public int value; 
    public string coin_type; 
    public int weight; 
    // public string model_path; 

    public Item (string c_name, string c_description, bool c_stackable, int c_value, string c_coin_type, int c_weight) 
    { 
     name = c_name; 
     description = c_description; 
     stackable = c_stackable; 
     value = c_value; 
     coin_type = c_coin_type; 
     weight = c_weight; 
     // model_path = c_model_path; 
     //, string c_model_path) 
    } 
    public int CompareTo(Item other) 
    { 
     return String.Compare (name, other.name); // a < ab < b (sortowanie wg. litery) 
    } 
} 

Dann habe ich eine "Kind" Klasse, die von der Klasse Artikel ableitet.

public class Armor : Item, IComparable <Armor> 
{ 
    public string armor_prof; 
    public string armor_category; 
    public int armor_class; 
    public int armor_str_req; 
    public string armor_stealth_mod; 
    //public string armor_property; 
    public Armor (string c_name, string c_description, bool c_stackable, int c_value, string c_coin_type, int c_weight, string c_armor_prof, string c_armor_category, int c_armor_class, int c_armor_str_req, string c_armor_stealth_mod) : base (c_name, c_description, c_stackable, c_value, c_coin_type, c_weight) 
    { 
     armor_prof = c_armor_prof; 
     armor_category = c_armor_category; 
     armor_class = c_armor_class; 
     armor_str_req = c_armor_str_req; 
     armor_stealth_mod = c_armor_stealth_mod; 
    // armor_property = c_armor_property; 
    } 

Dies ist die Funktion, die sie Elemente und sortiert ergänzt:

public void AddToCharacterInventory(Item it) 
    { 
     if (it is Weapon) 
     { 
      charInvWeapon.Add((Weapon)it); 
      charInvWeapon.Sort(); 
     } 
     else if (it is Armor) 
     { 
      charInvArmor.Add((Armor)it); 
      charInvArmor.Sort(); 
     } 
} 

I Artikel Dann fügen:

AddToCharacterInventory(new Armor("Leather armor", "Description.", false, 10, "gp", 10, "Leather", "Light Armor", 11, 0, "")); 

Es charInvArmor hinzugefügt zur Liste benannt. Nun, wie kann man es basierend auf einer Eigenschaft entfernen? Zum Beispiel mit dem Namen "Lederrüstung". Es ist also der Name der öffentlichen Zeichenkette, welche Klassenpanzerung vom Klassenelement erbt. Es ist einfach zu .Entfernen Position von der Liste, wenn es eine einfache Zeichenfolge ist, aber wie es in einem solchen Fall zu tun, wenn Typ eine Klasse mit Eigenschaften ist?

Antwort

2

Betrachten wir beispielsweise folgende, sollte es Ihnen richtige Richtung :)

static void Main() 
{ 
    var items = new List<Item>() 
    { 
     new Item("Axe", true), 
     new Item("Armor", false), 
     new Item("Horse", false) 
    }; 

    var remove = items.FirstOrDefault(item => 
    { 
     return item.Name.Equals("Armor", StringComparison.InvariantCultureIgnoreCase) && 
       !item.Active; 
    }); 

    if (remove != null) 
     items.Remove(remove); 

    Console.WriteLine(string.Join(", ", items.Select(item => item.Name))); 
    Console.ReadLine(); 
} 

public class Item 
{ 
    public Item(string name, bool active) 
    { 
     Name = name; 
     Active = active; 
    } 

    public string Name { get; set; } 

    public bool Active { get; set; } 
} 

example

1

Sie verschiedene Möglichkeiten haben, das zu tun. Eine Möglichkeit ist es, das Objekt und entfernen Sie es wie folgt zu finden:

var item= charInvArmor.First(c=>c.Name =="something"); 
charInvArmor.Remove(item); 

Der andere Weg ist die Umsetzung IEquatable (See this post)

Es ist auch möglich RemoveAt zu verwenden, aber ich verwenden in der Regel method1

+0

Gut, aber es gibt bessere Möglichkeiten, Strings zu vergleichen. Wenn Sie Zeichenfolgen vergleichen, sollten Sie die Methoden verwenden, die explizit angeben, welche Art von Vergleich Sie durchführen möchten. –

+0

@MikkoViitala danke, aber er fragte nicht darüber :) –

+0

Ja, Sie haben Recht damit. Dennoch ist es gut sich daran zu erinnern, dass es am besten ist, die Operatoren == und! = Zu vermeiden, wenn Sie Strings vergleichen. Kopieren/Einfügen Beispiele könnten in das Programm eines anderen schlüpfen. –