You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity单元测试中:如何用LINQ反转数组并获取指定首个元素?

问题原因分析
  1. 数组本身为null:不管调用Array.Reverse(references)还是references.Reverse(),如果references是null,都会直接触发NullReferenceException。而之前的foreach和First()方法能正常运行,大概率是对应测试用例里references不为null且存在符合条件的元素,但反转逻辑的测试用例中,references可能是null,或者反转后没有符合状态的元素。
  2. First()方法的特性:First()在找不到匹配元素时会直接抛出异常,而你最初的foreach方法会返回null。反转后如果没有符合State == StorageSlot.Available的元素,First()就会触发异常,这也是报错的核心原因之一。
正确实现方式

要同时解决数组null检查、反转需求、无匹配时返回null这几个问题,推荐两种写法:

写法一:不修改原数组(推荐)

用LINQ的Reverse()返回反转后的序列,配合FirstOrDefault()在无匹配时返回null,同时先做null判断:

public ChaptersReferenceBase GetAvailableReference()
{
    if (references == null) return null;
    return references.Reverse().FirstOrDefault(reference => reference.State == StorageSlot.Available);
}

这里的Reverse()不会改变原数组的顺序,只是生成一个反转后的枚举序列,不会影响其他依赖原数组顺序的逻辑。

写法二:修改原数组(谨慎使用)

如果确实需要改变原数组的元素顺序,先做null检查,反转后用FirstOrDefault()替代First():

public ChaptersReferenceBase GetAvailableReference()
{
    if (references == null) return null;
    Array.Reverse(references);
    return references.FirstOrDefault(reference => reference.State == StorageSlot.Available);
}

注意:Array.Reverse()会直接修改原数组的顺序,如果其他业务逻辑依赖原数组的原始顺序,这种写法会引发连锁问题,需谨慎使用。

单元测试注意点

在Unity单元测试中,要覆盖以下场景:

  • references为null时,验证方法返回null
  • references不为null但无符合条件元素时,验证方法返回null
  • references中有符合条件元素时,验证反转后取到的是原数组最后一个符合条件的元素

内容的提问来源于stack exchange,提问作者Ando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:42:14