亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#的自定義語法糖的使用詳解

發布時間:2020-10-23 19:40:15 來源:腳本之家 閱讀:273 作者:程度飛 欄目:編程語言

語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。

對If...Where的封裝——語法糖WhereIf(如果讀者已經知曉,請自行跳過)

在做條件查詢的時候,我們可能經常要寫這樣的代碼:

    List<User> Query(User queryModel)
    {
      //定義一個演示數據集
      List<User> userList = new List<User>
      {
        new User{ UserName = "燕雙鷹", Phone = "10369852103", Role = "正派" , Sex = true},
        new User{ UserName = "沈七七", Phone = "14785203630", Role = "反派",  Sex = true},
        new User{ UserName = "步鷹",  Phone = "14702021596", Role = "反派",  Sex = true},
        new User{ UserName = "小玲",  Phone = "19469874106", Role = "正派",  Sex = false},
        new User{ UserName = "趙一平", Phone = "18502369740", Role = "反派",  Sex = true}
      };
      var data = userList.AsQueryable();//轉為IQueryable類型

      //條件過濾
      if (!string.IsNullOrEmpty(queryModel.UserName))
      {
        data = data.Where(u => u.UserName == queryModel.UserName);
      }
      if (!string.IsNullOrEmpty(queryModel.Phone))
      {
        data = data.Where(u => u.Phone == queryModel.Phone);
      }
      if (!string.IsNullOrEmpty(queryModel.Role))
      {
        data = data.Where(u => u.Role == queryModel.Role);
      }
      if (queryModel.Sex != null)
      {
        data = data.Where(u => u.Sex == queryModel.Sex);
      }
      return data.ToList();
    }

當傳入的參數不為空時,才執行查詢。很明顯,這里大量的If-Where語句是極為簡單,且不斷重復出現的代碼(邏輯),可以進行封裝以簡化操作,以簡化代碼。

創建泛型擴展方法WhereIf,代碼如下:

    public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> predicate)
    {
      return condition
        ? query.Where(predicate)
        : query;
    }

該方法實現了對If-Where的封裝,使用方法如下:

    List<User> Query(User queryModel)
    {
      //定義一個演示數據集
      List<User> userList = new List<User>
      {
        new User{ UserName = "燕雙鷹", Phone = "10369852103", Role = "正派" , Sex = true},
        new User{ UserName = "沈七七", Phone = "14785203630", Role = "反派",  Sex = true},
        new User{ UserName = "步鷹",  Phone = "14702021596", Role = "反派",  Sex = true},
        new User{ UserName = "小玲",  Phone = "19469874106", Role = "正派",  Sex = false},
        new User{ UserName = "趙一平", Phone = "18502369740", Role = "反派",  Sex = true}
      };

      var data = userList.AsQueryable()
        .WhereIf(!string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == queryModel.UserName)
        .WhereIf(!string.IsNullOrEmpty(queryModel.Phone), u => u.Phone == queryModel.Phone)
        .WhereIf(!string.IsNullOrEmpty(queryModel.Role), u => u.Role == queryModel.Role)
        .WhereIf(queryModel.Sex != null, u => u.Sex == queryModel.Sex);
      return data.ToList();
    }

之前超過8行代碼的查詢代碼,被精簡到4行,代碼行數減少超過一半,可讀性大幅提高,由于只是簡單的封裝,運行效率幾乎不變。(減少大量代碼,提高可讀性,功能不變,效率不變,有優無缺,因此強烈建議WhereIf來代替傳統的If-Where操作。)

新的問題來了,If語句還存在一個條件不滿足的情況:else,WhereIf方法只封裝了IfWhere,卻沒有封裝If-Whrere-else-Where語句,如果遇到如下的查詢要求,要怎么做呢?

      if (!string.IsNullOrEmpty(queryModel.UserName))
      {
        data = data.Where(u => u.UserName == queryModel.UserName);
      }
      else
      {
        data = data.Where(u => u.UserName == "燕雙鷹");//如果查詢條件為空,就查詢燕雙鷹的姓名
      }

有三個辦法可以解決這個問題:

第一個辦法,是修改WhereIf方法,增加else-Where的邏輯,使其支持If-Whrere-else-Where的邏輯:

public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> truePredicate, Expression<Func<T, bool>> falsePredicate = null)
      => condition ? query.Where(truePredicate) : falsePredicate == null ? query : query.Where(falsePredicate);

這樣的做的缺點也是明顯的:在參數condition為false時,會進行第二次邏輯判斷,缺點是減低效率,優點是代碼簡潔。(當然,多一個邏輯判斷也減低不了多少效率)

第二個方法,避免第二次邏輯判斷的方式是進行方法重載,也就是寫兩個WhereIf方法,在新增的這個WhereIf方法中,參數falsePredicate不再設置為可空參數:

public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> truePredicate, Expression<Func<T, bool>> falsePredicate)
      => condition ? query.Where(truePredicate) : query.Where(falsePredicate);

優點是可以在不影響效率的情況下支持If-Whrere-else-Where邏輯,因為兩個WhereIf方法的邏輯是差不多的,缺點是又寫了簡單重復的代碼,不簡潔。(當然,僅僅是定義它的時候不簡潔,調用時候簡潔程度和方法一,是一樣的)

第三個方法,完全不修改WhereIf方法, 僅僅在調用的時候,通過對參數condition進行取反操作,來達到目的:

var data2 = data.WhereIf(!string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == queryModel.UserName)
              .WhereIf(string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == "燕雙鷹");

優點:方法定義最簡單,缺點:在遇到If-Whrere-else-Where邏輯時,會增加代碼量。

具體選擇哪一種,請讀者自行斟酌,如果有更好的實現方法,就留言討論分享出來吧^_^

對for循環的封裝,語法糖For

實際開發中,很多時候對for循環的使用,僅僅是將一個操作,循環指定的次數,而且其中沒有break、continue這些提前終止循環的邏輯。這種簡單重復的邏輯可以進行提取封裝。

    public static void For(int count, Action<int> action)
    {
      for (int i = 0; i < count; i++)
      {
        action.Invoke(i);
      }
    }

這里使用了C#的內置泛型委托Action,發揮的作用就是將方法作為參數去傳遞。參數count表示循環總次數,Action的參數int,表示正在進行的循環次數,從0開始,讀者可以根據需要改成從1開始(這里從1開始好,還是從0開始好,待定)。

調用:

SyntacticSugar.For(1, p => { int a = p + 8; data2.Remove(data2[a]); });

如果認為這樣調用麻煩,可以在參數count前加this,使之變為擴展方法,以簡化調用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富蕴县| 潜江市| 永寿县| 曲阜市| 玉林市| 邵武市| 板桥市| 县级市| 遂川县| 历史| 荣成市| 阳原县| 韶关市| 景东| 娄烦县| 沂水县| 临清市| 灵川县| 南雄市| 鹤峰县| 湖北省| 雅江县| 梧州市| 丰都县| 黑水县| 临颍县| 宣武区| 东乡族自治县| 门源| 芷江| 大荔县| 始兴县| 霍林郭勒市| 望江县| 嘉义县| 仙游县| 沾益县| 汉阴县| 北安市| 柘荣县| 定边县|