动态添加列表

Posted

技术标签:

【中文标题】动态添加列表【英文标题】:Dynamically adding list 【发布时间】:2021-05-02 03:03:25 【问题描述】:

我想动态创建一个列表。

目前我让用户输入他们想要的名称。那我想把他们提交的名字作为名单的名字。

例如:

用户输入“Collection1”,然后我想在另一个脚本上动态创建一个列表,如下所示:

List<int> Collection1 = new List<int>();

目前我不知道该怎么做,有没有办法创建列表或重命名列表,例如从tempListCollection1 ?

有点背景,所以目前我正在尝试创建一个纸牌游戏。用户可以将选定的卡片放入牌组中。我想给用户一个命名牌组的选项。因此,为了区分多个牌组(我使用列表来完成),我需要为列表设置一个不同的名称。最好我想让用户插入套牌的名称。所以在这种情况下,我需要能够重命名/更改/创建一个基于他们插入的牌组名称的列表。 因此,如果用户想将他们的牌组命名为 collection1,我希望将列表命名为 collection1List

还有一种可能性是,用户(如在玩家中)会创建不止一副牌。因此不适合创建预定义列表。

【问题讨论】:

您要解决的问题是什么? 这个的用例是什么?用户不编写代码...作为开发人员的您...之后您的代码被编译并且您不只是在之后扩展编译的代码;)...您的意思可能是Dictionary&lt;string, List&lt;int&gt;&gt;所以你可以通过字符串键名来处理不同的列表? 变量名有什么区别?这是您希望用户看到的东西吗?用户永远不会看到变量名,所以如果你想向他们展示一些东西,你必须像其他所有东西一样将它存储为数据。或许你需要制作一个既有List又有字符串Name的类,也就是列表的名字 【参考方案1】:

有没有办法创建列表或将列表重命名,例如从 tempList 到 Collection1?

不!

这将是什么用例?用户不编写/读取/关心代码......作为开发人员的你......之后你的代码被编译并且你不只是在运行时扩展编译的代码;)


听起来您想要使用的是Dictionary&lt;string, List&lt;int&gt;&gt;,因此您可以通过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

【讨论】:

以上是关于动态添加列表的主要内容,如果未能解决你的问题,请参考以下文章

动态添加列表

动态添加 optgroup 列表

角度如何动态添加组件列表

如何动态添加 vue bootstrap 下拉列表项?

将项目动态添加到列表小部件

在 Flutter 的垂直列表中添加动态高度水平列表视图