.NET框架是否有工具生成指定范围的BlockData对象排列?
.NET 实现字段值排列生成唯一对象的方案
.NET框架本身没有专门直接生成这类字段值排列并创建对应对象的现成工具函数,但可以通过LINQ轻松实现需求,利用笛卡尔积组合所有可能的字段值,再映射为BlockData对象。
实现示例
先定义各字段的取值范围:
unit1:0到259的整数序列unit2:布尔值true和falseunit3:5到245的整数序列
使用LINQ的嵌套查询(或
SelectMany)实现笛卡尔积,生成所有组合并创建对象:
using System.Linq; // 生成各字段的取值范围 var unit1Values = Enumerable.Range(0, 260); // 0-259共260个值 var unit2Values = new[] { true, false }; var unit3Values = Enumerable.Range(5, 241); // 5-245共241个值 // 生成所有组合并实例化BlockData var allBlockDataObjects = from u1 in unit1Values from u2 in unit2Values from u3 in unit3Values select new BlockData { unit1 = u1, unit2 = u2, unit3 = u3 };
关键注意事项
- 总对象数量计算:
260 * 2 * 241 = 125320,这个量级在内存中可控;如果后续字段范围扩大,要注意内存占用,必要时分批处理。 - 原代码中
BlockData的字段为私有,无法直接在LINQ中赋值,需做调整:- 改成公共属性:
public class BlockData { public int unit1 { get; set; } // valid values are [0-259] public bool unit2 { get; set; } public int unit3 { get; set; } // valid values are [5-245] } - 或者添加构造函数初始化:
public class BlockData { int unit1; // valid values are [0-259] bool unit2; int unit3; // valid values are [5-245] public BlockData(int u1, bool u2, int u3) { unit1 = u1; unit2 = u2; unit3 = u3; } } // 对应LINQ部分改为:select new BlockData(u1, u2, u3)
- 改成公共属性:
内容的提问来源于stack exchange,提问作者sajis997
相关产品推荐
相关产品推荐

