代码合同,以防止重复列表

时间:2012-08-25 19:22:01

标签: c# code-contracts

我目前正在检查此契约,参数和返回值不为空。现在,我需要一种方法来检查无论交换机的哪个分支,所以生成的IEnumerable必须不能在其代码值上重复。这是否可以使用代码契约。我尝试使用Contract.ForAll,但没有运气。

internal static IEnumerable<MenuItemAction> GetMenuActions(MenuItem menuItem)
{
    Contract.Requires(menuItem != null);
    Contract.Ensures(Contract.Result<IEnumerable<MenuItemAction>>() != null);

    switch (menuItem.Code)
    {
        case 0:
            return new MenuItemAction[3] { 
        new MenuItemAction(){Code = 0, Label = "."}, 
        new MenuItemAction(){Code = 1, Label = ".."}, 
        new MenuItemAction(){Code = 2, Label = "..."}
    };
        case 1:
            return new MenuItemAction[2] { 
        new MenuItemAction(){Code = 3, Label = "."}, 
        new MenuItemAction(){Code = 4, Label = ".."}
    };
        case 2:
            return new MenuItemAction[2] { 
        new MenuItemAction(){Code = 5, Label = "."}, 
        new MenuItemAction(){Code = 6, Label = ".."}
    };
        default: return null;
    }
}

2 个答案:

答案 0 :(得分:3)

尝试

Contract.Ensures(
    Contract.Result<IEnumerable<MenuItemAction>>() != null &&
    Contract.Result<IEnumerable<MenuItemAction>>().Count() == 
        Contract.Result<IEnumerable<MenuItemAction>>()
           .Select(m => m.Code)
           .Distinct()
           .Count()
);

答案 1 :(得分:1)

合同的代码是什么。所有?你观察到了什么?

虽然你实际上没有要求替代方案,但我建议你考虑使用setinstead of Array。

覆盖MenuItemAction上的Equals和GetHashCode,每次你想要一组不同的项目时 - 使用Set集合。

它保证值是唯一的,如果你想知道是否遇到重复项,你需要做的就是检查Add方法的返回值。

这一切都归结为你想要实现的目标?您想确保不同的值,还是要确保没有人将相同的值放两次? (您是否试图保护内容或用途?)。

无论如何,MenueItem的代码是否可以在0-4范围之外?或者换句话说 - 如果代码是OutOfRange(提示提示: - ),那么你实际上是指方法返回null吗?