C# - 如何从具有最高特定参数的通用列表中获取项目?
C# - How to get item from Generic List with the highest specific parameter?
我搜索了很多,但找不到我理解得足以转化到我的项目中的答案。目标是什么:我需要在列表中找到具有最高 armor_class 参数的物品,并将该物品的 armor_class 添加到角色的盔甲 class.
所以,我们有一个这样创建的列表:
public List<Weapon> characterInvWeapon;
public List<Armor> characterInvArmor;
等等
以下是 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 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;
}
public int CompareTo(Armor other)
{
if (armor_class == other.armor_class)
return String.Compare (name, other.name); // a < ab < b
else
return other.armor_class - armor_class;
}
}
盔甲是 class 继承自 class 的物品,具有前 6 个属性。装甲存储在特定于装甲的列表中 - public List<Armor> characterInvArmor;
.
示例项目:
AddToItemStore(new Armor("Breastplate", "Description.", false, 400, "gp", 20, "Breastplate", "Medium Armor", 14, 0, ""));
添加脚本:
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();
}
}
现在正如我提到的,我需要在列表 charInvArmor 中找到一个具有最高 armor_class 参数的项目,并在其他函数中使用它的值,该函数根据许多变量计算护甲 class。
所以在其他函数中,characterArmorClass = armorWithHighestArmorClass + otherVariable + someotherVariable;
等
我怀疑 Linq 中有一些方便的快捷方式,但我非常感谢没有 Linq 的一些示例。 Linq 也很受欢迎,但我对它绝对是新手,而且我还担心性能和我的应用程序与 iPhone 的兼容性。我读过 iOS can cause problems with Linq。这必须是快速且兼容的计算。
使用 LINQ:
int maxArmorClass = characterInvArmor.Max(armor => armor.armor_class);
没有带排序的 LINQ:
var list = characterInvArmor.ToList(); // copy list, so we do not break sorted orded
list.Sort((armor1, armor2) => armor2.armor_class.CompareTo(armor1.armor_class));
int maxArmorClass = list[0].armor_class;
当然,您始终可以编写带有循环和 "max" 变量的手动方法。
顺便说一句,我注意到,您使用 AddToCharacterInventory
方法对 charInvArmor
进行排序。如果数组始终排序,那么根据您的 CompareTo
实现,具有最大值 armor_class
的项目应该始终排在最后(或者第一个,我不确定)。所以只取列表的最后一个(第一个)元素。
您必须遍历列表并检查每个值,因为列表未根据装甲 class 值排序并且您不想使用 LINQ:
int maxArmorClass = 0;
foreach (var armor in characterInvArmor)
{
// Do a comparison here and see if you found a higher value
// If a higher value is found, store it in maxArmorClass
}
作为旁注,我推荐以下链接:
Public Fields versus Automatic Properties
和
Style guide for c# * 在C#中,Pascal大小写和驼峰大小写是约定俗成的。
我搜索了很多,但找不到我理解得足以转化到我的项目中的答案。目标是什么:我需要在列表中找到具有最高 armor_class 参数的物品,并将该物品的 armor_class 添加到角色的盔甲 class.
所以,我们有一个这样创建的列表:
public List<Weapon> characterInvWeapon;
public List<Armor> characterInvArmor;
等等
以下是 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 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;
}
public int CompareTo(Armor other)
{
if (armor_class == other.armor_class)
return String.Compare (name, other.name); // a < ab < b
else
return other.armor_class - armor_class;
}
}
盔甲是 class 继承自 class 的物品,具有前 6 个属性。装甲存储在特定于装甲的列表中 - public List<Armor> characterInvArmor;
.
示例项目:
AddToItemStore(new Armor("Breastplate", "Description.", false, 400, "gp", 20, "Breastplate", "Medium Armor", 14, 0, ""));
添加脚本:
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();
}
}
现在正如我提到的,我需要在列表 charInvArmor 中找到一个具有最高 armor_class 参数的项目,并在其他函数中使用它的值,该函数根据许多变量计算护甲 class。
所以在其他函数中,characterArmorClass = armorWithHighestArmorClass + otherVariable + someotherVariable;
等
我怀疑 Linq 中有一些方便的快捷方式,但我非常感谢没有 Linq 的一些示例。 Linq 也很受欢迎,但我对它绝对是新手,而且我还担心性能和我的应用程序与 iPhone 的兼容性。我读过 iOS can cause problems with Linq。这必须是快速且兼容的计算。
使用 LINQ:
int maxArmorClass = characterInvArmor.Max(armor => armor.armor_class);
没有带排序的 LINQ:
var list = characterInvArmor.ToList(); // copy list, so we do not break sorted orded
list.Sort((armor1, armor2) => armor2.armor_class.CompareTo(armor1.armor_class));
int maxArmorClass = list[0].armor_class;
当然,您始终可以编写带有循环和 "max" 变量的手动方法。
顺便说一句,我注意到,您使用 AddToCharacterInventory
方法对 charInvArmor
进行排序。如果数组始终排序,那么根据您的 CompareTo
实现,具有最大值 armor_class
的项目应该始终排在最后(或者第一个,我不确定)。所以只取列表的最后一个(第一个)元素。
您必须遍历列表并检查每个值,因为列表未根据装甲 class 值排序并且您不想使用 LINQ:
int maxArmorClass = 0;
foreach (var armor in characterInvArmor)
{
// Do a comparison here and see if you found a higher value
// If a higher value is found, store it in maxArmorClass
}
作为旁注,我推荐以下链接:
Public Fields versus Automatic Properties
和
Style guide for c# * 在C#中,Pascal大小写和驼峰大小写是约定俗成的。