如何使用NBuilder为Person类填充指定范围的嵌套HashSet<int>?
解决NBuilder生成带指定范围HashSet的Person列表问题
我之前也碰到过类似的情况——NBuilder默认不会自动填充HashSet<int>这类复杂集合,所以才会出现null的情况。咱们只需要给NBuilder指定自定义的填充逻辑,就能生成符合要求的随机HashSet了。
第一步:明确Person类定义
假设你的Person类结构如下:
public class Person { public HashSet<int> NumberSet { get; set; } // 其他属性(如Name、Age)可按需保留 }
第二步:自定义HashSet生成逻辑
写一个方法来生成元素范围1-50的随机HashSet,还可以灵活控制集合的元素数量(示例中随机生成2到8个元素,你可以根据需求调整):
private static HashSet<int> GenerateRandomNumberSet() { var random = new Random(); var numberSet = new HashSet<int>(); // 随机设置集合元素数量 int elementCount = random.Next(2, 9); while (numberSet.Count < elementCount) { // 生成1-50的随机整数(Next上限为开区间,所以写51) int randomNum = random.Next(1, 51); numberSet.Add(randomNum); } return numberSet; }
第三步:用NBuilder结合自定义逻辑生成Person列表
通过NBuilder的.With()方法,给每个Person的NumberSet属性赋值咱们生成的HashSet:
using NBuilder; using System.Collections.Generic; // 生成包含10个Person的测试列表 var personList = Builder<Person>.CreateListOfSize(10) .All() .With(p => p.NumberSet = GenerateRandomNumberSet()) // 若有其他属性需要填充,可继续链式调用.With() // .With(p => p.Name = "测试姓名") .Build();
额外优化:用NBuilder内置RandomGenerator
如果你想直接用NBuilder自带的随机工具,也可以内联编写逻辑(无需自己实例化Random):
var personList = Builder<Person>.CreateListOfSize(10) .All() .With(p => { p.NumberSet = new HashSet<int>(); var generator = new RandomGenerator(); int count = generator.Next(1, 6); // 生成1-5个元素 for (int i = 0; i < count; i++) { p.NumberSet.Add(generator.Next(1, 51)); } }) .Build();
关键说明
- NBuilder仅会自动填充简单值类型(如int、string)和部分常见简单集合(如
List<T>),像HashSet<T>这类特殊集合必须显式指定填充逻辑。 - 注意Random实例的复用:如果在循环中频繁创建Random,可能会生成重复数值,建议在方法内仅实例化一次。
内容的提问来源于stack exchange,提问作者Guerrilla
相关产品推荐
相关产品推荐

