我有一些代码,虽然简单或许并不是很明显它的作用。
I found @(Model.Count() == 0 ? "no" : Model.Count().ToString()) @(Model.Count() == 1 ? "person" : "people")
@foreach (var item in Model) {
<div>@item.Name at @item.Email</div>
}
在我写这么多代码之前,我想知道这是否是一个很好的方法。
因此问题是,在.NET中有更好的框架方式来做到这一点,或者Ternary方法是否正常
前提显然是
答案 0 :(得分:5)
在我看来,在这种情况下使用Ternary
条件运算符是绝对正确的。
有经验的开发人员在不考虑它的情况下理解它,但如果您想让初学者轻松阅读,您也可以使用if
和else
构造。
但我会在评论中提到Any()
作为@ I4V。
I found @(Model.Any() ? Model.Count().ToString() : "no") @(Model.Count() == 1 ? "person" : "people")
@foreach (var item in Model) {
<div>@item.Name at @item.Email</div>
}
答案 1 :(得分:5)
如果你在一些地方这样做,扩展方法可以解决你的问题(可读性和简化代码)
public static string PersonCountString(this IEnumerable<Person> personList)
{
var count = personList.Count();
return String.Format("{0} {1}", count > 0 ? count : "no",
count == 1 ? "person" : "people");
}
...
I found (@Model.PersonCountString())
答案 2 :(得分:1)
回答你的问题:不,我发现oneliner不可读,对我来说就像@(() 0 ? "" : .().()) @(.() == 1 ? "" : "")
一样,更不用说对.Count()
的多次调用了。
您可以创建一个(共享)辅助方法,如下所示:
string GetCountWithDescription(int count,
string singleItemDescription,
string multipleItemsDescription)
{
switch (count)
{
case 0:
return "no " + multipleItemsDescription;
case 1:
return "1 " + singleItemDescription;
default:
return count + " " + multipleItemsDescription;
}
}
也可以重复使用,所以你可以把它放在一个单独的文件中,这样就不会使你的代码混乱,你可以从每个视图中调用它:
@GetCountWithDescription(Model.Count(), "person", "people")
答案 3 :(得分:0)
你想要达到什么目的?更好的可读性或更快的代码(开发)?如果目标是为了更好的可读性,那么我建议将三元运算保留在字符串中,例如:
string modelCountStr = Model.Count() == 0 ? "no" : Model.Count().ToString();
string modelPluralStr = Model.Count() == 1 ? "person" : "people";
答案 4 :(得分:0)
考虑到如果有任何用户,您必须使用Count()
:
@{
var count = Model.Count();
}
I found @(count == 0 ? "no" : count) @(count == 1 ? " person" : " people")
答案 5 :(得分:0)
使其更具可读性的另一种方法是选择一种解决方案,如果可能的话,涉及的条件很少或理想情况下为零。
这是我的看法:
@{
var count = Model.Count();
}
I found @string.Format(new[] { "no people", "{0} person", "{0} people"} [Math.Min(count, 2)], count)
可以说Math.Min负责某种分支,但我认为这更容易理解。