2

否则我如何将后续代码转换为一行

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"));
4

6 回答 6

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));
于 2013-11-04T10:30:08.447 回答
2

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

于 2013-11-04T10:29:06.197 回答
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 的回答那样进一步利用两个字符串的相似性。)

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

上面的每一种方法都会起作用,因为它们中的条件表达式都有值——在第一种情况下,值将是由Server.MapPath;返回的类型。在第二种情况下,该值将是 type string

至于你是否应该这样做:无论哪种方式都有争论。最初的方式具有清晰和简单的优点,但它确实涉及一些(可以说是不受欢迎的)重复。上面的后一种方法的优点是只说一次并强调整个语句的意图(加载报告),但可以说它比原来的方法稍微不那么清楚,这取决于人们对条件表达式的习惯。YMMV。

于 2013-11-04T10:30:01.927 回答
1

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

string fileName = (data.BaseCompareId == 2) ? "MonthGroup.mrt" : "YearGroup.mrt";
report.Load(Server.MapPath("~/Content/StimulReports/" + fileName));
于 2013-11-04T10:34:27.433 回答
0

此语法仅适用于它返回某些内容的情况。因此,您可以执行以下操作:

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

report.Load(Server.MapPath(path));
于 2013-11-04T10:32:07.420 回答
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
于 2013-11-04T12:01:59.520 回答