2013-11-04 46 views
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")); 
+1

它怎么不起作用?它没有编译?或者它没有产生预期的结果? – bump

+4

在这种情况下,请勿使用三元运算符(?:)。你没有获得任何东西,只是让你的代码不易读。 – helb

+0

我不明白为什么你提到“一行”,因为你将三元运算符分散在三行。如果您想要:只需删除换行符,就可以在一行中放入一个if! –

回答

2

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

+0

同意 - 为什么这样做?第一个例子很明显,第二种方法让你读了几次。 –

+1

如果希望使用“不重复自己”(DRY)的原则,那么第一种情况是很差的,因为它复制'report.Load(使用Server.Mappath(...'。 –

+0

@DavidArno,所以做他的第二个情况。) –

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

(或者你可以进一步发挥两个字符串的相似性,如如上所述,你的方法不起作用,因为你试图用条件表达式替换条件语句,并且条件表达式必须具有hav e 。由于report.Load显然返回void,因此cond ? report.Load(...) : report.Load(...)表单的条件表达式没有值,因此它不起作用。

上述每种方法都可以工作,因为其中的条件表达式具有值 - 在第一种情况下,该值将是由Server.MapPath返回的类型的值;在第二种情况下,该值将是类型string

至于是否应该做到这一点:有两种方法都有参数。原来的方式具有清晰和简单的优点,但确实涉及到一些(可以说是不受欢迎的)重复。上面的后一种方法的优点是只说一次,强调整个陈述的意图(加载报告),但它可以说比原始陈述略少一些,取决于人们如何看待条件表达式。因人而异。

4

尝试用这个代替:

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

由于report.Load()返回一个空,它不会工作。

编辑后的版本:

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

一个很好的答案,但请看到@helb答案一种改进的实施 –

0

这句法仅仅是它返回的东西的情况。所以,你可以这样做:

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

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

如果您想将使用:在这里使用它,只是这是实际上是不同的是在分支语句中的一部分:

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

这是最好的答案海事组织你有零代码重复不过。 ,一些人似乎发现三元操作符很难阅读,仍然可能会支持OP的原始代码。 –

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