最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#的自定義語(yǔ)法糖的使用詳解

 更新時(shí)間:2019年05月06日 08:30:34   作者:程度飛  
這篇文章主要介紹了C#的自定義語(yǔ)法糖的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

語(yǔ)法糖(Syntactic sugar),也譯為糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì)。

對(duì)If...Where的封裝——語(yǔ)法糖WhereIf(如果讀者已經(jīng)知曉,請(qǐng)自行跳過(guò))

在做條件查詢的時(shí)候,我們可能經(jīng)常要寫這樣的代碼:

    List<User> Query(User queryModel)
    {
      //定義一個(gè)演示數(shù)據(jù)集
      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();//轉(zhuǎn)為IQueryable類型

      //條件過(guò)濾
      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();
    }

當(dāng)傳入的參數(shù)不為空時(shí),才執(zhí)行查詢。很明顯,這里大量的If-Where語(yǔ)句是極為簡(jiǎn)單,且不斷重復(fù)出現(xiàn)的代碼(邏輯),可以進(jìn)行封裝以簡(jiǎn)化操作,以簡(jiǎn)化代碼。

創(chuàng)建泛型擴(kuò)展方法WhereIf,代碼如下:

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

該方法實(shí)現(xiàn)了對(duì)If-Where的封裝,使用方法如下:

    List<User> Query(User queryModel)
    {
      //定義一個(gè)演示數(shù)據(jù)集
      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();
    }

之前超過(guò)8行代碼的查詢代碼,被精簡(jiǎn)到4行,代碼行數(shù)減少超過(guò)一半,可讀性大幅提高,由于只是簡(jiǎn)單的封裝,運(yùn)行效率幾乎不變。(減少大量代碼,提高可讀性,功能不變,效率不變,有優(yōu)無(wú)缺,因此強(qiáng)烈建議WhereIf來(lái)代替?zhèn)鹘y(tǒng)的If-Where操作。)

新的問(wèn)題來(lái)了,If語(yǔ)句還存在一個(gè)條件不滿足的情況:else,WhereIf方法只封裝了IfWhere,卻沒(méi)有封裝If-Whrere-else-Where語(yǔ)句,如果遇到如下的查詢要求,要怎么做呢?

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

有三個(gè)辦法可以解決這個(gè)問(wèn)題:

第一個(gè)辦法,是修改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);

這樣的做的缺點(diǎn)也是明顯的:在參數(shù)condition為false時(shí),會(huì)進(jìn)行第二次邏輯判斷,缺點(diǎn)是減低效率,優(yōu)點(diǎn)是代碼簡(jiǎn)潔。(當(dāng)然,多一個(gè)邏輯判斷也減低不了多少效率)

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

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

優(yōu)點(diǎn)是可以在不影響效率的情況下支持If-Whrere-else-Where邏輯,因?yàn)閮蓚€(gè)WhereIf方法的邏輯是差不多的,缺點(diǎn)是又寫了簡(jiǎn)單重復(fù)的代碼,不簡(jiǎn)潔。(當(dāng)然,僅僅是定義它的時(shí)候不簡(jiǎn)潔,調(diào)用時(shí)候簡(jiǎn)潔程度和方法一,是一樣的)

第三個(gè)方法,完全不修改WhereIf方法, 僅僅在調(diào)用的時(shí)候,通過(guò)對(duì)參數(shù)condition進(jìn)行取反操作,來(lái)達(dá)到目的:

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

優(yōu)點(diǎn):方法定義最簡(jiǎn)單,缺點(diǎn):在遇到If-Whrere-else-Where邏輯時(shí),會(huì)增加代碼量。

具體選擇哪一種,請(qǐng)讀者自行斟酌,如果有更好的實(shí)現(xiàn)方法,就留言討論分享出來(lái)吧^_^

對(duì)for循環(huán)的封裝,語(yǔ)法糖For

實(shí)際開發(fā)中,很多時(shí)候?qū)or循環(huán)的使用,僅僅是將一個(gè)操作,循環(huán)指定的次數(shù),而且其中沒(méi)有break、continue這些提前終止循環(huán)的邏輯。這種簡(jiǎn)單重復(fù)的邏輯可以進(jìn)行提取封裝。

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

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

調(diào)用:

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

如果認(rèn)為這樣調(diào)用麻煩,可以在參數(shù)count前加this,使之變?yōu)閿U(kuò)展方法,以簡(jiǎn)化調(diào)用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    這篇文章主要介紹了用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用C#實(shí)現(xiàn)簡(jiǎn)單的線性回歸的代碼詳解

    使用C#實(shí)現(xiàn)簡(jiǎn)單的線性回歸的代碼詳解

    最近注意到了NumSharp,想學(xué)習(xí)一下,最好的學(xué)習(xí)方式就是去實(shí)踐,因此從github上找了一個(gè)用python實(shí)現(xiàn)的簡(jiǎn)單線性回歸代碼,然后基于NumSharp用C#進(jìn)行了改寫,需要的朋友可以參考下
    2024-01-01
  • WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法

    WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法

    這篇文章主要介紹了WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法,主要通過(guò)一個(gè)ControlTools類來(lái)實(shí)現(xiàn)該功能,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    TFTP不僅有斷點(diǎn)續(xù)傳,多用戶級(jí)別限制等功能,本文主要介紹了C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • C#中Action和Func的區(qū)別

    C#中Action和Func的區(qū)別

    這篇文章主要介紹了C#中Action和Func的區(qū)別,是進(jìn)行C#程序設(shè)計(jì)時(shí)需要加以注意的知識(shí)點(diǎn),需要的朋友可以參考下
    2014-09-09
  • C#第三方日志插件Log4net的配置文件詳解

    C#第三方日志插件Log4net的配置文件詳解

    Log4net是一個(gè)穩(wěn)定且功能豐富的日志庫(kù),已經(jīng)存在多年并且被廣泛使用,這篇文章主要為大家詳細(xì)介紹了Log4net日志插件的配置文件信息,感興趣的可以了解下
    2024-03-03
  • 淺談C#中的委托、事件與異步

    淺談C#中的委托、事件與異步

    本文主要介紹了C#中的委托、事件與異步的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • C#表達(dá)式樹基礎(chǔ)教程

    C#表達(dá)式樹基礎(chǔ)教程

    這篇文章介紹了C#表達(dá)式樹的基礎(chǔ)教程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C# 設(shè)計(jì)模式系列教程-單例模式

    C# 設(shè)計(jì)模式系列教程-單例模式

    單例模式防止在應(yīng)用程序中實(shí)例化多個(gè)對(duì)象。這就節(jié)約了開銷,每個(gè)實(shí)例都要占用一定的內(nèi)存,創(chuàng)建對(duì)象時(shí)需要時(shí)間和空間。
    2016-06-06
  • C#實(shí)現(xiàn)微信跳一跳小游戲的自動(dòng)跳躍助手開發(fā)實(shí)戰(zhàn)

    C#實(shí)現(xiàn)微信跳一跳小游戲的自動(dòng)跳躍助手開發(fā)實(shí)戰(zhàn)

    前段時(shí)間微信更新了新版本后,帶來(lái)的一款H5小游戲“跳一跳”在各朋友圈里又火了起來(lái),類似以前的“打飛機(jī)”游戲,這游戲玩法簡(jiǎn)單,但加上了積分排名功能后,卻成了“裝逼”的地方,于是很多人花錢花時(shí)間的刷積分搶排名
    2018-01-01

最新評(píng)論

英德市| 惠州市| 海阳市| 安平县| 基隆市| 喀什市| 桦川县| 三台县| 新巴尔虎右旗| 龙州县| 富民县| 香格里拉县| 滦平县| 平泉县| 苏尼特右旗| 大安市| 汾西县| 安平县| 囊谦县| 灵山县| 建瓯市| 东平县| 通河县| 车险| 满城县| 谢通门县| 南郑县| 龙门县| 方山县| 兴义市| 铜陵市| 沈阳市| 皋兰县| 九江市| 额济纳旗| 韩城市| 繁昌县| 怀集县| 汾西县| 鄂州市| 江城|