我需要一个字典列表,每个字典应包含已知数量的字符串,字符串对,键是确定性的,但值应该是随机字符串,列表中的每个字典必须具有相同的键。 一些背景信息:字符串,字符串对表示包含产品实体的数据库表中的值,我使用字典向我的testdatabase添加新行。要创建两行,我需要两个字典,如下所示:
new Dictionary<string, string>() { { "productno", "1001" }, { "productname", "testproduct" } };
new Dictionary<string, string>() { { "productno", "1002" }, { "productname", "testproduct2" } };
productno和productname是列名,以及词典中的键。
我按照评论中的指示尝试var dicts = new Fixture().Create<List<IDictionary<string, string>>>();
,它给出了三个字典的列表,每个字典都有一个GUID作为键,一个随机字符串作为值。
当键是确定性的时候,如何正确填充词典的键?
我目前的解决方案有些冗长,但附加的好处是它可以生成任意类型的随机值(但不测试除字符串以外的其他类型)。 它只使用Autofixture来填充随机值,但是很想知道Autofixture中是否有内容可以做同样的事情。我现在拥有的:
public SqlReaderFixtureBuilder AddRows(string table, string[] columns, Type[] types, int no)
{
var fixture = new Fixture();
for (int rowno = 0; rowno < no; rowno++)
{
if (!tablerows.ContainsKey(table))
tablerows[table] = new List<Dictionary<string, object>>();
var values = new Dictionary<string, object>();
for (int i = 0; i < columns.Length; i++)
{
values[columns[i]] = new SpecimenContext(fixture).Resolve(types[i]);
}
tablerows[table].Add(values);
}
return this;
}
调用它:AddRows("products", new[] { "productno", "productname" }, new[] { typeof(string), typeof(string) }, 30)
答案 0 :(得分:3)
使用确定性密钥创建字典相当容易。由于键不是匿名值,因此最好在AutoFixture之外创建它们,并将它们与AutoFixture创建的值合并:
var fixture = new Fixture();
var columns = new[] { "productno", "productname" };
var values = fixture.Create<Generator<string>>();
var dict = columns
.Zip(values, Tuple.Create)
.ToDictionary(t => t.Item1, t => t.Item2);
这将创建一个词典(dict
),其中包含columns
中两个键的值。
您可以在ICustomization
Dictionary<string, string>
中打包这样的内容,这意味着当您请求多个Dictionary<string, string>
值时,您将获得多个字典,就像这样