我在Unity3D + C#中创建游戏。
我目前得到的是:一个SQL数据表,由8列组成,总共包含3个条目,列表“_WeapList”包含每个条目(如下所示)。
public struct data
{
public string Name;
public int ID, dmg, range, magazin, startammo;
public float tbtwb, rltimer;
}
List<data> _WeapList;
public Dictionary<int, data>_WeapoList; //probable change
[...]
//reading the SQL Table + parse it into a new List-entry
while (rdr.Read())
{
data itm = new data();
itm.Name = rdr["Name"].ToString();
itm.ID = int.Parse (rdr["ID"].ToString());
itm.dmg = int.Parse (rdr["dmg"].ToString());
itm.range = int.Parse (rdr["range"].ToString());
itm.magazin = int.Parse (rdr["magazin"].ToString());
itm.startammo = int.Parse (rdr["startammo"].ToString());
itm.tbtwb = float.Parse(rdr["tbtwb"].ToString());
itm.rltimer = float.Parse(rdr["rltimer"].ToString());
_WeapList.Add(itm);
_WeapoList.Add(itm.ID, itm);//probable change
}
现在我想创建一个“武器”类,它将具有相同的8个字段,通过给定的ID提供它们
如何在列表/结构中提取特定项的值(由int ID确定,它始终是唯一的?)
public class Weapons : MonoBehaviour
{
public string _Name;
public int _ID, _dmg, _range, _magazin, _startammo;
public float _tbtwb, _rltimer;
void Start()
{//Heres the main problem
_Name = _WeapoList...?
_dmg = _WeapoList...?
}
}
答案 0 :(得分:3)
如果您的武器集合可能变得非常大或者您需要经常查找武器,我建议使用字典而不是列表(使用武器ID作为键)。查找will be much quicker using a Dictionary key,而不是使用循环或LINQ搜索List。
您可以通过修改代码来执行此操作,如下所示:
public Dictionary<int, data>_WeapList;
[...]
//reading the SQL Table + parse it into a new List-entry
while (rdr.Read())
{
data itm = new data();
itm.Name = rdr["Name"].ToString();
itm.ID = int.Parse (rdr["ID"].ToString());
itm.dmg = int.Parse (rdr["dmg"].ToString());
itm.range = int.Parse (rdr["range"].ToString());
itm.magazin = int.Parse (rdr["magazin"].ToString());
itm.startammo = int.Parse (rdr["startammo"].ToString());
itm.tbtwb = float.Parse(rdr["tbtwb"].ToString());
itm.rltimer = float.Parse(rdr["rltimer"].ToString());
_WeapList.Add(itm.ID, itm);//probable change
}
然后,要访问列表中的元素,只需使用语法:
_WeapList[weaponID].dmg; // To access the damage of the weapon with the given weaponID
防范无效ID:
如果提供的weaponID
风险不存在,您可以先使用.ContainsKey()
方法检查,然后再尝试访问其成员:
if (_WeapList.ContainsKey(weaponID))
{
// Retrieve the weapon and access its members
}
else
{
// Weapon doesn't exist, default behaviour
}
或者,如果您习惯使用out
参数,则可以使用.TryGetValue()
进行验证 - 这比分别调用.ContainsKey()
更快:
data weaponData;
if (_WeapList.TryGetValue(weaponID, out weaponData))
{
// weaponData is now populated with the weapon and you can access members on it
}
else
{
// Weapon doesn't exist, default behaviour
}
希望这有帮助!如果您有任何问题,请告诉我。
答案 1 :(得分:2)
让specificWeapon
成为要在列表中搜索的武器,然后您可以使用以下代码从武器列表中选择该项目,如果未找到,则会返回null
。希望这就是你要找的东西:
var selectedWeapon = WeapList.FirstOrDefault(x=> x.ID == specificWeapon.ID);
if(selectedWeapon != null)
{
// this is your weapon proceed
}
else
{
// not found your weapon
}
答案 2 :(得分:1)
您可以使用LINQ
通过weaponId搜索特定对象
var Weapon = _WeapList.FirstOrDefault(w=> w.ID == weaponId);