在 FsCheck 中生成唯一字符串
Generating unique strings in FsCheck
我需要生成唯一的非 null
字符串用作 Dictionary
键。我试过类似的东西:
public static Gen<NonNull<string>> UniqueStrings()
{
return from s in Arb.Default.NonNull<string>().Generator
select s;
}
然后我用UniqueString()
在:
public static Arb<Foo> Foos()
{
// Foo's constructor will use the string parameter
// as key to an internal Dictionary
return (from nonNullString in UniqueStrings()
select new Foo(nonNullString.Item)).ToArbitrary();
}
但是,我在属性测试中遇到异常 Foo
,因为 FsCheck 有时会生成相同的字符串两次,从而导致 DuplicateKeyException
.
如何生成唯一的字符串以传递给 Foo
的构造函数?
您可以在插入字典之前添加一个简单的检查,而不是生成 uniq 字符串。
更新:
行。在生成后洗牌你的字符串。您可以阅读 here
它是关于整数数组的,但您可以轻松地为字符串自定义它
要生成唯一字符串,您可以使用 Guid 生成器,这是生成唯一字符串的标准方法,即使在多台计算机上也是如此。
您不能强制 FsCheck 生成器生成唯一值,因为您基本上无权访问以前生成的值的历史记录,FsCheck 本身也不会保证唯一性。
在这种情况下你可以做的是说生成一个字符串列表,然后 unique-ify 使用 Distinct()
的列表。然后,您还可以使用类似的方法生成 Foo 的列表。
例如:
Gen<Foo[]> res = from s in Arb.Default.Set<string>().Generator
select s.Select(ss => new Foo(ss)).ToArray();
(请注意,您不能使用 from 来获取 ss
,因为 C# 不允许您混合使用不同的 LINQ 方法,一种是 Gen
,一种是 IEnumerable
)
一个提案,我想知道这是否是您要检查的额外 属性。如果 Foo
的用户应该给它一个唯一的字符串,这是如何支持的?如果他们不这样做会怎样?
我需要生成唯一的非 null
字符串用作 Dictionary
键。我试过类似的东西:
public static Gen<NonNull<string>> UniqueStrings()
{
return from s in Arb.Default.NonNull<string>().Generator
select s;
}
然后我用UniqueString()
在:
public static Arb<Foo> Foos()
{
// Foo's constructor will use the string parameter
// as key to an internal Dictionary
return (from nonNullString in UniqueStrings()
select new Foo(nonNullString.Item)).ToArbitrary();
}
但是,我在属性测试中遇到异常 Foo
,因为 FsCheck 有时会生成相同的字符串两次,从而导致 DuplicateKeyException
.
如何生成唯一的字符串以传递给 Foo
的构造函数?
您可以在插入字典之前添加一个简单的检查,而不是生成 uniq 字符串。
更新:
行。在生成后洗牌你的字符串。您可以阅读 here
它是关于整数数组的,但您可以轻松地为字符串自定义它
要生成唯一字符串,您可以使用 Guid 生成器,这是生成唯一字符串的标准方法,即使在多台计算机上也是如此。
您不能强制 FsCheck 生成器生成唯一值,因为您基本上无权访问以前生成的值的历史记录,FsCheck 本身也不会保证唯一性。
在这种情况下你可以做的是说生成一个字符串列表,然后 unique-ify 使用 Distinct()
的列表。然后,您还可以使用类似的方法生成 Foo 的列表。
例如:
Gen<Foo[]> res = from s in Arb.Default.Set<string>().Generator
select s.Select(ss => new Foo(ss)).ToArray();
(请注意,您不能使用 from 来获取 ss
,因为 C# 不允许您混合使用不同的 LINQ 方法,一种是 Gen
,一种是 IEnumerable
)
一个提案,我想知道这是否是您要检查的额外 属性。如果 Foo
的用户应该给它一个唯一的字符串,这是如何支持的?如果他们不这样做会怎样?