【问题标题】: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的类,也就是列表的名字

标签: c# list unity3d


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 2013-03-27
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2017-11-08
      • 2019-04-22
      相关资源
      最近更新 更多