如何使用构造函数从通用列表中删除基于 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
搜索了很多,但我想不通。 我有一件 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