【问题标题】:C# Check if a slot of an array is filled with a class objectC#检查数组的槽是否被类对象填充
【发布时间】:2014-07-18 20:59:07
【问题描述】:

我尝试“勾选”名为“knownSolarSystems”的数组中的每个对象,但由于定义,每个数组槽都已设置。 (至少不是空的les)

CSolarSystem[] knownSolarSystems;
public void Start () {
    knownSolarSystems = new CSolarSystem[10];
    knownSolarSystems[0] = new CSolarSystem();
}

在上面我创建了一个 CSolarSystem 类的对象,我将其粘贴到数组的第一个(第 0 个?)槽中。 (knownSolarSystems[0])

但即使我只有 1 个对象,foreach 循环也会继续 10 次,这给了我错误,因为它试图访问一些尚未定义的对象。

这是 foreach 循环:

foreach(CSolarSystem solarSystem in knownSolarSystems) {
    solarSystem.Update();
}

这是错误:

NullReferenecException: Object reference not set to an instance of an object CUniverse.Update()

那么有没有办法“跳过”那些没有填满的插槽?

致以最诚挚的问候,deSpeach

【问题讨论】:

  • 除了使用Where 跳过null 值之外,你真的需要将它初始化为长度为10 的数组吗?你能改用List<CSolarSystem> 吗?
  • 我想但是我不知道如何有效地使用它们所以我使用数组
  • 你应该真正使用 List,其中 T 是你的 CSolarSystem。这样就无需事先知道您处理了多少物体(当然,如果您知道太阳系中有多少物体,您仍然可以使用数组并将您的发现发布到 astronomy.stackexchange.com :-)
  • 我拥有的列表的最大问题是我无法真正访问我想要的列表...例如,我不知道如何尽可能轻松地处理这些列表数组。 (例如使用数组:example[1] = 5; 但使用列表:example.add(20); 但是如果我添加另一个插槽,我如何才能访问之前的插槽?这就是我使用数组的原因
  • "但是如果我添加另一个插槽,我如何访问之前的插槽?" 您可以像访问数组一样访问列表,例如通过索引:CSolarSystem last = knownSolarSystems[knownSolarSystems.Count-1]

标签: c# arrays object


【解决方案1】:

使用Where 消除null 值:

foreach(CSolarSystem solarSystem in knownSolarSystems.Where(x => x != null))
{
   solarSystem.Update();
}

【讨论】:

    【解决方案2】:

    那么有没有办法“跳过”那些没有填满的插槽?

    您可以简单地检查它是否仍未初始化 (null):

    foreach(CSolarSystem solarSystem in knownSolarSystems.Where(s => s != null)) {
        solarSystem.Update();
    }
    

    请注意,您需要在文件顶部添加using System.Linq

    另一种方法是使用List<T>,而不是可以增加的数组:

    List<CSolarSystem> knownSolarSystems = new List<CSolarSystem>();
    
    public void Start () {
        knownSolarSystems.Add(new CSolarSystem());
    }
    

    【讨论】:

    • 它给了我错误,没有“哪里”的定义
    • 你需要添加using System.Linq,我已经编辑了我的答案。
    【解决方案3】:

    当然:检查一个插槽是否已满,如果没有则跳过它。

    foreach(CSolarSystem solarSystem in knownSolarSystems) {
        if (solarSystem == null) continue;
        solarSystem.Update();
    }
    

    null 测试也可以移动,因为其他人发布的 LINQ 版本显示。

    【讨论】:

    • 但是这个也跳过了填充的数组 D:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多