如何使用构造函数从通用列表中删除基于 class 的项目?

How to remove from Generic List an item based on class with constructor?

搜索了很多,但我想不通。 我有一件 class 盔甲,有一些属性。我可以添加它,而且我是通过同时添加排序的功能来完成的。

我有class个商品:

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)
    }
}

然后我有一个 "child" class 派生自 class 项目。

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;
    }

这是添加项目并对它们进行排序的函数:

    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();
        }
}

然后我添加项目:

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

它被添加到名为 charInvArmor 的列表中。现在,如何根据 属性 删除它? 例如,按姓名 "Leather Armor"。所以,它是 public 字符串名称,class 盔甲继承自 class 物品。 如果它是一个简单的字符串,很容易从列表中删除位置,但是在这种情况下,当类型是具有属性的 class 时如何做到这一点?

考虑下面的例子,它应该会引导你走向正确的方向:)

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; }
}

你有不同的方法来做到这一点。 一种方法是找到对象,然后像这样删除它:

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

另一种方法是实现 IEquatable (See this post)

用RemoveAt也是可以的,不过我自己一般用method1