簡體   English   中英

三元最佳實踐

[英]Ternary Best Practice

我有一些代碼,盡管做起來很簡單,但也許可能並不立刻明白。

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中是否有更好的框架方法可以執行此操作,或者三元方法是否還可以

前提顯然是

  • 0條記錄=我沒有人
  • 1條記錄=我找到1個人
  • 2條以上記錄=我發現2個人

在我看來,將Ternary條件運算符用於這種條件絕對是很好的。

有經驗的開發人員無需考慮即可理解它,但是如果您想讓初學者更容易理解它,則也可以使用ifelse構造。

但是我將使用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>
}

如果您在幾個地方這樣做,擴展方法將同時解決您的問題(可讀性和簡化代碼)

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())

要回答您的問題:不,我發現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")

您想達到什么目的? 更好的可讀性或更快的代碼(開發)? 如果目標是提高可讀性,那么我建議將三元運算保留在字符串中,例如:

string modelCountStr = Model.Count() == 0 ? "no" : Model.Count().ToString(); string modelPluralStr = Model.Count() == 1 ? "person" : "people";

考慮到如果存在任何用戶,則必須使用Count()

@{ 
    var count = Model.Count();
}

I found @(count == 0 ? "no" : count) @(count == 1 ? " person" : " people")

使其更具可讀性的另一種方法是選擇一種解決方案,其中盡可能少地或理想地涉及零條件。

這是我的看法:

@{ 
    var count = Model.Count(); 
}
I found @string.Format(new[] { "no people", "{0} person", "{0} people"} [Math.Min(count, 2)], count)

可以說Math.Min負責某種分支,但是我認為這更容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM