3

我需要生成唯一的非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

4

3 回答 3

3

您不能强制 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 方法,一种是 on Gen,一种是 on IEnumerable

一个建议,我想知道这是否不是您要检查的额外属性。如果用户Foo应该给它一个唯一的字符串,那是如何支持的?如果他们不这样做会怎样?

于 2016-01-15T17:26:17.167 回答
2

要生成唯一字符串,您可以使用Guid生成器,它是生成唯一字符串的标准方法,即使跨多台计算机也是如此。

于 2016-01-15T08:13:44.610 回答
0

您可以在插入字典之前添加一个简单的检查,而不是生成 uniq 字符串。

更新:好的。在一代之后洗牌你的字符串。您可以在此处
阅读 有关整数数组的信息,但您可以轻松地为字符串自定义它

于 2016-01-15T06:18:37.383 回答