如果将其他代码
转换为一行,如何将代码转换为一行?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"));
答案 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