动态添加列表
Posted
技术标签:
【中文标题】动态添加列表【英文标题】:Dynamically adding list 【发布时间】:2021-05-02 03:03:25 【问题描述】:我想动态创建一个列表。
目前我让用户输入他们想要的名称。那我想把他们提交的名字作为名单的名字。
例如:
用户输入“Collection1”,然后我想在另一个脚本上动态创建一个列表,如下所示:
List<int> Collection1 = new List<int>();
目前我不知道该怎么做,有没有办法创建列表或重命名列表,例如从tempList
到Collection1
?
有点背景,所以目前我正在尝试创建一个纸牌游戏。用户可以将选定的卡片放入牌组中。我想给用户一个命名牌组的选项。因此,为了区分多个牌组(我使用列表来完成),我需要为列表设置一个不同的名称。最好我想让用户插入套牌的名称。所以在这种情况下,我需要能够重命名/更改/创建一个基于他们插入的牌组名称的列表。 因此,如果用户想将他们的牌组命名为 collection1,我希望将列表命名为 collection1List。
还有一种可能性是,用户(如在玩家中)会创建不止一副牌。因此不适合创建预定义列表。
【问题讨论】:
您要解决的问题是什么? 这个的用例是什么?用户不编写代码...作为开发人员的您...之后您的代码被编译并且您不只是在之后扩展编译的代码;)...您的意思可能是Dictionary<string, List<int>>
所以你可以通过字符串键名来处理不同的列表?
变量名有什么区别?这是您希望用户看到的东西吗?用户永远不会看到变量名,所以如果你想向他们展示一些东西,你必须像其他所有东西一样将它存储为数据。或许你需要制作一个既有List又有字符串Name的类,也就是列表的名字
【参考方案1】:
有没有办法创建列表或将列表重命名,例如从 tempList 到 Collection1?
不!
这将是什么用例?用户不编写/读取/关心代码......作为开发人员的你......之后你的代码被编译并且你不只是在运行时扩展编译的代码;)
听起来您想要使用的是Dictionary<string, List<int>>
,因此您可以通过string
键名来寻址不同的列表,例如
private Dictionary<string, List<int>> _lists = new Dictionary<string, List<int>>();
// list is optional => if you already have a list you want to register pass it in
// if only a string is passed in a new list is automatically created
public void AddList(string keyName, List<int> list = null)
if(_lists.ContainsKey(keyName))
Debug.LogError($"Already contains a list with key name keyName", this);
return;
if(list == null) list = new List<int>();
_lists.Add(keyName, list);
public List<int> GetList(string keyName)
if(!_lists.ContainsKey(keyName))
Debug.LogError($"Does not contain a list with key name keyName", this);
return null;
return _lists[keyName];
// or alternatively
public bool TryGetList(string keyName, out List<int> list)
return _lists.TryGetValue(keyName);
public void RemoveList(string keyName)
if(!_lists.ContainsKey(keyName))
Debug.LogError($"Does not contain a list with key name keyName", this);
return null;
_lists.Remove(keyName);
现在 IF 的“用户”实际上是指开发人员在 Unity 中使用您的脚本,它可能会变得更复杂一些,但您可以执行类似的操作
[Serializable]
public class ListEntry
public string Name;
public List<int> Values;
// Edit via the Inspector in Unity
public ListEntry[] lists;
然后您可以通过 Inspector 简单地添加和命名您的列表。
然后我仍然会在运行时使用之前的代码(或类似的代码),并使用检查器中的值创建字典一次,例如
private void Awake()
foreach(var list in lists)
_lists.Add(list.Name, list.Values);
当然你可以/应该实现一些东西来确保所有列表名称都是唯一的。在OnValidate
或自定义编辑器脚本中......但我认为这有点超出了这个问题的范围;)
【讨论】:
【参考方案2】:变量名称,在您的代码中没有任何价值。它们类似于在您的代码周围引用的实际值的占位符。由于您提出的问题没有用例,因此答案是否。
如果你想基于一个键创建/访问一个列表,那么你可以创建一个包含列表的字典。
Dictionary<string,List<int>> lists = new Dictionary<string,List<int>>();
那么,当新用户进入时
lists.Add("username", new List<int>);
// or if you want to use and existing
lists.Add("username", existingIntList);
然后像这样访问:
// i.e.
foreach (int userItem in lists["username"])
// etc
【讨论】:
以上是关于动态添加列表的主要内容,如果未能解决你的问题,请参考以下文章