c#conditional&包容性逻辑流程结构

时间:2011-06-10 18:47:56

标签: c# asp.net-mvc-2

我正在使用asp.net页面,需要根据数值输出html。

因此逻辑是:

如果ReferenceCount大于13,则输出Div-1:

Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());

如果ReferenceCount大于16,则输出Div-1和Div-2:

Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());
Html.RenderPartial("TShirt", Model.tweets.FirstOrDefault());

如果ReferenceCount大于17,则输出Div-1和Div-2以及Div-3:

Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());
Html.RenderPartial("TShirt", Model.tweets.FirstOrDefault());
Html.RenderPartial("Banner", Model.tweets.FirstOrDefault());

如果ReferenceCount大于22,则输出Div-1和Div-2以及Div-3和Div-4:

Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());
Html.RenderPartial("TShirt", Model.tweets.FirstOrDefault());
Html.RenderPartial("Banner", Model.tweets.FirstOrDefault());
Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());

等共进行了27次评估......

有没有人有任何好的想法如何尽可能有效地构建这个逻辑流程?

我宁愿没有那么多的if语句,我考虑过一个Switch语句,它允许你通过各种Case测试,但是你似乎无法在Switch的Case语句中使用表达式在C#。

谢谢, 斯科特

2 个答案:

答案 0 :(得分:1)

如果你真的有这种模式,你应该把它抽象成这样的东西:

class TweetSetting
{
    public int MinReferenceCount { get; protected set; }
    public string ViewName { get; protected set; }

    public TweetSetting(int minReferenceCount, string viewName)
    {
        MinReferenceCount = minReferenceCount;
        ViewName = viewName;
    }
}

…

var settings =
    new[]
    {
        new TweetSetting(13, "Tweet"),
        new TweetSetting(16, "TShirt"),
        new TweetSetting(17, "Banner"),
        new TweetSetting(22, "Tweet")
    };

var referenceCount = …; // whatever

foreach (var setting in settings)
{
    if (referenceCount <= setting.MinReferenceCount)
        break;

    Html.RenderPartial(setting.ViewName, Model.tweets.FirstOrDefault());
}

这样,如果某些内容发生变化,您只需修改settings即可。更好的是:您可以从设置文件中加载它,并且修改根本不需要更改代码。

答案 1 :(得分:0)

如果每个语句只是添加一个额外的行,那么我会做这样的事情

if (refcount > 13)
    Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());
if (refcount > 16)
    Html.RenderPartial("TShirt", Model.tweets.FirstOrDefault());
if (refcount > 17)
    Html.RenderPartial("Banner", Model.tweets.FirstOrDefault());
if (refcount > 22)
    Html.RenderPartial("Tweet", Model.tweets.FirstOrDefault());

这样你就不会那么重复自己了。