获取struct / List的特定值

时间:2017-01-05 17:01:01

标签: c# list unity3d struct

我在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...?
    }
}

3 个答案:

答案 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);