寻求兼容.NET SDK 3.1 LTS的C++ std::iota等效实现方案
兼容.NET 3.1 LTS的C++ std::iota等效实现
你需要将C++中使用std::iota生成固定步长递增序列的逻辑移植到.NET 3.1 LTS环境,以下是两种可直接落地的实现方案:
方案1:直接使用内置API(适用于生成新数组场景)
.NET 3.1内置的Enumerable.Range方法可以直接实现需求,对应你给出的C++示例,移植后的代码为:
// 等效于C++中生成从-4开始的10个递增int元素 int[] ar = Enumerable.Range(-4, 10).ToArray();
生成结果为{-4, -3, -2, -1, 0, 1, 2, 3, 4, 5},和C++版本完全一致。
该方案优势是无需自定义代码,性能和兼容性都有官方保障,仅限制生成int类型的序列
方案2:自定义扩展方法(适配修改现有集合、非int类型场景)
如果需要和std::iota一样支持填充现有集合的指定区间、或是生成long、float等其他数值类型的序列,可以自定义通用扩展方法:
首先定义扩展类:
using System.Collections.Generic; public static class CollectionExtensions { /// <summary> /// 功能等效于C++ std::iota,为集合指定区间依次填充递增的序列值 /// </summary> /// <typeparam name="T">数值类型,支持自增操作</typeparam> /// <param name="collection">目标可写集合</param> /// <param name="startIndex">填充的起始索引</param> /// <param name="fillCount">需要填充的元素数量</param> /// <param name="initialValue">序列初始值</param> public static void Iota<T>(this IList<T> collection, int startIndex, int fillCount, T initialValue) where T : struct, System.IComparable<T>, System.IEquatable<T> { dynamic currentVal = initialValue; int endIndex = System.Math.Min(startIndex + fillCount, collection.Count); for (int i = startIndex; i < endIndex; i++) { collection[i] = currentVal++; } } }
使用示例:
// 先创建长度为10的数组 int[] ar = new int[10]; // 从索引0开始填充10个元素,初始值为-4,完全等效于C++示例代码 ar.Iota(0, 10, -4);
该方案支持所有可自增的数值类型,可灵活适配各种自定义填充场景
内容的提问来源于stack exchange,提问作者Mizux
相关产品推荐
相关产品推荐

