gpt4 book ai didi

c# - 在 FsCheck 中生成唯一字符串

转载 作者:行者123 更新时间:2023-11-30 14:51:17 25 4
gpt4 key购买 nike

我需要生成唯一的非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 的构造函数?

最佳答案

您不能强制 FsCheck 生成器生成唯一值,因为您基本上无权访问以前生成的值的历史记录,FsCheck 本身也不会保证唯一性。

在这种情况下,您可以做的是生成一个字符串列表,然后使用 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 的用户应该给它一个唯一的字符串,那是如何支持的?如果他们不这样做会怎样?

关于c# - 在 FsCheck 中生成唯一字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com