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

如何判断创建的array<UInt16>^托管数组是否全部填充为零?

判断C++/CLI中UInt16数组是否全为零

当然可以用TrueForAll方法来实现这个需求,这是.NET框架提供的非常简洁的解决方案,完全可行!

使用TrueForAll的实现方式

Array::TrueForAll方法会遍历数组中的每个元素,验证是否都满足你指定的条件。对于你的UInt16数组,只需要判断每个元素是否等于0即可。

如果你的环境支持C++/CLI lambda表达式(较新的编译器版本均支持),可以直接写出简洁的代码:

array<UInt16>^ temp = gcnew array<UInt16>(1000);
// 假设这里可能填充了数据...

bool allZero = Array::TrueForAll(temp, gcnew Predicate<UInt16>([](UInt16 value) {
    return value == 0;
}));

如果是不支持lambda的老版本C++/CLI,可以通过静态方法来创建委托:

ref class ArrayHelpers {
public:
    static bool IsUInt16Zero(UInt16 value) {
        return value == 0;
    }
};

// 调用方式
array<UInt16>^ temp = gcnew array<UInt16>(1000);
bool allZero = Array::TrueForAll(temp, gcnew Predicate<UInt16>(&ArrayHelpers::IsUInt16Zero));

其他可选实现方式

除了TrueForAll,你也可以用更传统的遍历方式,代码同样清晰:

  • foreach遍历:
bool allZero = true;
for each (UInt16 val in temp) {
    if (val != 0) {
        allZero = false;
        break; // 一旦找到非零元素就提前退出,节省时间
    }
}
  • 指针直接访问(性能略优,适合超大数组):
    托管的UInt16数组在内存中是连续存储的,你可以用pin_ptr固定数组后直接访问内存,减少托管代码的间接开销:
bool allZero = true;
pin_ptr<UInt16> arrayPtr = &temp[0];
for (int i = 0; i < temp->Length; ++i) {
    if (arrayPtr[i] != 0) {
        allZero = false;
        break;
    }
}

总结

TrueForAll是完全可行的方案,尤其是lambda版本的代码非常简洁易读,对于你1000个元素的数组来说,性能完全没问题。如果你追求极致性能,指针遍历会略快一点,但日常开发中TrueForAll的可读性优势更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:35