【问题标题】:Unity: Array of Lists variable. How to declare it correctly in C#Unity:列表变量数组。如何在 C# 中正确声明它
【发布时间】:2021-12-20 06:26:14
【问题描述】:

我需要在 Unity 中声明一个列表数组变量。数组大小是固定的,它是 5。我的代码按我的意愿工作,但我认为必须有更好、更短的方法来做到这一点:

public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[] {new List<GameObject>(), new List<GameObject>(), new List<GameObject>(), new List<GameObject>(), new List<GameObject>() };

我试着这样做:

public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[5];

但我有一个错误:对象引用未设置为对象的实例。

有什么方法可以更简单地声明我的变量吗?我的意思是如果我的阵列只有 5 个插槽就可以了,但如果是 100 个呢?在声明中复制 new List... 100 次有点愚蠢。

【问题讨论】:

标签: c# arrays list unity3d


【解决方案1】:

试试这个

var  arraySize=6; //or what size you need

List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[arraySize];

charactersOnBoardSortedP1=  charactersOnBoardSortedP1
                           .Select(obsp => obsp = new List<GameObject>()) 
                            .ToArray();

或者如果您需要同时启动更多的东西

for (var i=0; i<  charactersOnBoardSortedP1.Length; i++)
{
    charactersOnBoardSortedP1[i]=new List<GameObject>();
    // if you need to add some elements in the same time
    charactersOnBoardSortedP1[i].Add(new GameObject {Id=i});
}

【讨论】:

  • 请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;)
  • @derHugo 谢谢,正如您所见,我有 2 个变体 - 一个带有空列表,另一个变体仅显示了在需要时将一些对象添加到列表中的最舒适(恕我直言)方式。
  • 只是想提一下,因为似乎不是每个人都知道GameObject 是如何工作的;)在第一个代码 sn-p 中,new List&lt;GameObject&gt;[arraySize]; 是完全多余的,尽管后来你还是通过 Linq 覆盖了它跨度>
【解决方案2】:

最简单的实现方法如下:

int arraySize = 5;
List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Repeat(new List<GameObject>(), arraySize).ToArray();

这将创建以空List&lt;GameObject&gt;()填充的指定大小的数组

如果你希望列表中有GameObject,你可以稍微修改一下上面的代码。

int arraySize = 5;
List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Repeat(new List<GameObject> { new GameObject()}, arraySize).ToArray();

【讨论】:

  • 请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;)
  • @derHugo 我也提到了解决方案。
【解决方案3】:

试试这个。 Test here

创建一个列表变量数组。 将每个 Array 项初始化为一个新的 GameObject 列表。 然后您可以添加到所述数组的列表中。

using System;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        // create array of lists
        List<GameObject>[] COBSP1 = new List<GameObject>[5]; //charactersOnBoardSortedP1
        // setup lists
        COBSP1[0] = new List<GameObject>();
        COBSP1[1] = new List<GameObject>();
        COBSP1[2] = new List<GameObject>();
        COBSP1[3] = new List<GameObject>();
        COBSP1[4] = new List<GameObject>();
        
        // add objects to said list
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
    }
    
}

【讨论】:

  • 如果您的 COBSP1 数组包含大量值,则可以使用 for 循环。
  • 请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;)
  • @derHugo COBSP1[4].Add(new GameObject()); 是示例代码,重新正确
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多