如果否则我如何将else转换为一行?

时间:2013-11-04 10:27:34

标签: c# asp.net-mvc

如果将其他代码

转换为一行,如何将代码转换为一行?
if (data.BaseCompareId == 2)
    report.Load(Server.MapPath("~/Content/StimulReports/MonthGroup.mrt"));
else
    report.Load(Server.MapPath("~/Content/StimulReports/YearGroup.mrt")); 

我尝试使用此代码但无效

data.BaseCompareId == 2
    ? report.Load(Server.MapPath("~/Content/StimulReports/MonthGroup.mrt"))
    : report.Load(Server.MapPath("~/Content/StimulReports/YearGroup.mrt"));

6 个答案:

答案 0 :(得分:5)

请尝试使用此功能:

string path = data.BaseCompareId == 2
    ? "~/Content/StimulReports/MonthGroup.mrt"
    : "~/Content/StimulReports/YearGroup.mrt";
report.Load(Server.MapPath(path));

由于report.Load()返回一个void,它不起作用。

编辑版:

string s = data.BaseCompareId == 2 
      ? "MonthGroup.mrt" 
      : "YearGroup.mrt";
report.Load(Server.MapPath("~/Content/StimulReports/" + s));

答案 1 :(得分:2)

我假设report.Load返回一个void,因此它“无效”。那就是说,你为什么要这样做?第一个例子非常清楚。

答案 2 :(得分:1)

如果您想使用三元运算符,您可以执行以下操作:

report.Load(data.BaseCompareId == 2 ? Server.MapPath("~/Content/StimulReports/MonthGroup.mrt") : Server.MapPath("~/Content/StimulReports/YearGroup.mrt"));

或(更好):

report.Load(Server.MapPath(data.BaseCompareId == 2 ? "~/Content/StimulReports/MonthGroup.mrt" : "~/Content/StimulReports/YearGroup.mrt"));

(或者你可以进一步利用两个字符串中的相似性,正如@ helb的答案那样。)

正如已经指出的那样,你的方法不起作用,因为你试图用条件表达式替换条件语句,条件表达式必须有。由于report.Load显然会返回void,因此cond ? report.Load(...) : report.Load(...)形式的条件表达式没有值,因此它不起作用。

上述每种方式都有效,因为它们中的条件表达式具有值 - 在第一种情况下,该值将是Server.MapPath返回的类型;在第二种情况下,值的类型为string

至于你是否应该这样做:有两种方式都可以参与。原始方式具有清晰和简单的优点,但它确实涉及一些(可以说是不合需要的)重复。上面的方法有一个优点,就是只说一次并强调整个语句的意图(加载一个报告),但它可以说比原来稍微不清楚,这取决于人们如何看待条件表达式。 YMMV。

答案 3 :(得分:1)

如果你想要使用?:这里使用它,所以只有实际上不同的部分在分支声明中:

string fileName = (data.BaseCompareId == 2) ? "MonthGroup.mrt" : "YearGroup.mrt";
report.Load(Server.MapPath("~/Content/StimulReports/" + fileName));

答案 4 :(得分:0)

此语法仅适用于返回某些内容的情况。所以你可以这样做:

var path = (data.BaseCompareId == 2) ? "~/Content/StimulReports/MonthGroup.mrt" : "~/Content/StimulReports/YearGroup.mrt";

report.Load(Server.MapPath(path));

答案 5 :(得分:0)

这对于单行班车来说是最简洁的......

report.Load(Server.MapPath(string.Format("~/Content/StimulReports/{0}Group.mrt", data.CompareId == 2 ? "Month" : "Year")));

然而,似乎你只是想让事情看起来更清洁。 数据调用和条件逻辑之间的抽象更多。 您可能想要考虑将它们作为单独的方法,可能在您的报表对象上?

if(data.CompareId == 2)
    report.LoadStimulReports(ReportGroup.Month);
else
    report.LoadStimulReports(ReportGroup.Year);

在报表对象上使用枚举,扩展方法和静态方法......

public enum ReportGroup
{
    [DescriptionAttribute("~/Content/StimulReports/MonthGroup.mrt")]
    Month,
    [DescriptionAttribute("~/Content/StimulReports/YearGroup.mrt")]
    Year
}

public static T GetAttribute<T>(this Enum e) where T : Attribute
{
    System.Reflection.FieldInfo fi = e.GetType().GetField(e.ToString());
    object[] o = (object[])fi.GetCustomAttributes(typeof(T), false);
    return o.Length > 0 ? (T)o[0] : default(T);
}

public static void LoadStimulReports(ReportGroup reportGroup)
{
    report.Load(Server.MapPath(reportGroup.GetAttribute<DescriptionAttribute>().Description));
}

现在,如果您需要其他报告,只需在枚举中添加另一项即可。

[DescriptionAttribute("~/Content/StimulReports/WeekGroup.mrt")]
Week