日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:背景

1. 講故事

前幾天看同事在用 linq 給內(nèi)存中的兩個(gè) model 做左連接,用過(guò)的朋友都知道,你一定少不了一個(gè)叫做 DefaultIfEmpty 函數(shù),這玩意吧,本來(lái)很流暢的 from...in...join, 突然搞進(jìn)來(lái)這么一個(gè)函數(shù),真的是惡心他媽給惡心開門,惡心到家了,簡(jiǎn)化后的代碼如下:

class?User{public?int?UserID?{?get;?set;?}public?string?Email?{?get;?set;?}}class?Order{public?int?OrderID?{?get;?set;?}public?string?OrderTitle?{?get;?set;?}public?int?UserID?{?get;?set;?}}static?void?Main(string[]?args){var?userList?=?new?List<User>(){new?User(){?UserID=1,?Email="333@qq.com"},new?User(){?UserID=2,?Email="444@qq.com"},};var?orderList?=?new?List<Order>(){new?Order(){?OrderID=1,?OrderTitle="訂單1",?UserID=1},new?Order(){?OrderID=2,?OrderTitle="訂單2",?UserID=1}};var?query?=?from?u?in?userListjoin?o?in?orderList?on?u.UserID?equals?o.UserID?into?grpfrom?item?in?grp.DefaultIfEmpty()select?new?{?UserID?=?u.UserID,?OrderTitle?=?item?.OrderTitle?};???????}????

之所以出現(xiàn)這個(gè)情況是因?yàn)椴还苁?查詢關(guān)鍵詞 還是 擴(kuò)展方法,都并沒(méi)有直接對(duì) leftjoin 和 rightjoin 底層支持,只能通過(guò)變通的方式去實(shí)現(xiàn),這就很尷尬了,比如說(shuō)上面的這段代碼,你很難在多天之后還能準(zhǔn)確理解這里的 DefaultIfEmpty 是用來(lái)干嘛的,那現(xiàn)在問(wèn)題的關(guān)鍵在于,有沒(méi)有什么方法讓底層支持或者有可信的第三方幫我封裝好,還真巧,在 github 上 還真有一個(gè) morelinq 項(xiàng)目:https://github.com/morelinq/MoreLINQ,看 md 是給 Enumerable 擴(kuò)展了 60,70 個(gè)方法,如虎添翼呀,接下來(lái)一起來(lái)探索下吧。

二:MoreLinq 下的探索

1. 安裝

安裝非常簡(jiǎn)單,用 nuget 跑一下 ?Install-Package morelinq -Version 3.3.2 即可。

2. LeftJoin / RightJoin / FullJoin

在 morelinq 中就提供了 左外,右邊,全連接,這就很????????了,提高開發(fā)效率,讓我們更加專注業(yè)務(wù),這里就使用 leftjoin 來(lái)改造剛才的代碼,代碼如下:

var?query2?=?userList.LeftJoin(orderList,?u?=>?u.UserID,?o?=>?o.UserID,u?=>?new?{?UserID?=?u.UserID,?OrderTitle?=?default(string)?},(u,?o)?=>?new?{?UserID?=?u.UserID,?OrderTitle?=?o.OrderTitle?});

怎么樣,一句鏈?zhǔn)骄透愣?#xff0c;而且代碼還非常好理解。

  • 第一個(gè)參數(shù):join 集合

  • 第二個(gè)參數(shù):source 集合的關(guān)聯(lián) id

  • 第三個(gè)參數(shù):join 集合的關(guān)聯(lián) id

  • 第四個(gè)參數(shù):source 存在,join不存在 應(yīng)該返回的 model 架構(gòu)

  • 第五個(gè)參數(shù):source,join 都存在 ? ? ?應(yīng)該返回的 model 架構(gòu)

剛才也說(shuō)到了有60,70個(gè)擴(kuò)展方法,大家可以去趴一趴其他有趣的東西,這里我推薦幾個(gè)給大家演示一下,畢竟還是非常實(shí)用的。

3. Shuffle

從字面意思上看就是洗牌,挺實(shí)用的一個(gè)方法,很多時(shí)候我希望在一個(gè)集合中隨機(jī)抽取一條記錄,比如說(shuō)我有10套郵件模板,當(dāng)用戶下訂單之后,我希望可以隨機(jī)抽一套模板給用戶,以防被 qq郵箱 放入垃圾箱中,原來(lái)我需要是用 new guid 來(lái)實(shí)現(xiàn),如下代碼:

var?list?=?new?List<int>()?{?1,?3,?5,?7,?9,?11,?12?};var?query?=?list.OrderBy(m?=>?Guid.NewGuid());Console.WriteLine(string.Join(",",query));----?output?-----11,7,9,12,5,3,1

現(xiàn)在就簡(jiǎn)單多了,直接使用 Shuffle 搞定。

var?list?=?new?List<int>()?{?1,?3,?5,?7,?9,?11,?12?};var?query?=?list.Shuffle();Console.WriteLine(string.Join(",",?query));-----?output?------5,1,9,12,7,3,11

4. ?Insert

有時(shí)候我需要在 IEnumerable 集合的指定位置插入一個(gè)集合,舉個(gè)例子, A= { 1, 3, 5, 7, 9, 11, 12 }, B ={8}, 我希望將 8 插入到 7 和 9 之間,在現(xiàn)有的 Enumerable 下只有 Concat 和 Append 方法,無(wú)法做到指定插入,這個(gè)需求又可以被 moreqlinq 搞定啦。。。代碼如下:

IEnumerable<int>?list?=?new?List<int>()?{?1,?3,?5,?7,?9,?11,?12?};var?query?=?list.Insert(new?List<int>()?{?8?},?4);Console.WriteLine(string.Join(",",?query));

可以看到往一個(gè)集合的指定位置插入一個(gè)集合就是這么輕松如意,太爽啦~~~

5. ForEach

不知道什么原因,至今在 IEnumerable 下都沒(méi)有提供 ForEach 擴(kuò)展方法,我這個(gè)升斗小民反正是體會(huì)不到這么設(shè)計(jì)的哲學(xué)在哪里,在原來(lái)你只能 ToList 立即執(zhí)行,要么使用 foreach 進(jìn)行延期遍歷,現(xiàn)在就方便多了,簡(jiǎn)化的代碼如下:

IEnumerable<int>?list?=?new?List<int>()?{?1,?3,?5,?7,?9,?11,?12?};list.ForEach(m?=>{Console.Write(m+"?");});

6. ToDataTable

對(duì)在看的各位大佬估計(jì)都用不上,對(duì)我們公司幾個(gè) 10 + 年的項(xiàng)目,那是萬(wàn)萬(wàn)不能少哈,如有能用得上的,可以簡(jiǎn)單看一下:

非常簡(jiǎn)單,不過(guò)我還是好奇一下它是怎么做到的,可以用 ilspy 去翻翻它的源碼:

public?static?TTable?ToDataTable<T,?TTable>(this?IEnumerable<T>?source,?TTable?table,?params?Expression<Func<T,?object>>[]?expressions)?where?TTable?:?DataTable {MemberInfo[]?members?=?PrepareMemberInfos(expressions).ToArray();members?=?BuildOrBindSchema(table,?members);Func<T,?object[]>?func?=?CreateShredder<T>(members);table.BeginLoadData();try{foreach?(T?item?in?source){DataRow?dataRow?=?table.NewRow();dataRow.ItemArray?=?func(item);table.Rows.Add(dataRow);}return?table;}finally{table.EndLoadData();} }private?static?IEnumerable<MemberInfo>?PrepareMemberInfos<T>(ICollection<Expression<Func<T,?object>>>?expressions) {if?(expressions?==?null?||?expressions.Count?==?0){return?typeof(T).GetMembers(BindingFlags.Instance?|?BindingFlags.Public).Where(delegate(MemberInfo?m){if?(m.MemberType?!=?MemberTypes.Field){PropertyInfo?propertyInfo?=?m?as?PropertyInfo;if?((object)propertyInfo?!=?null?&&?propertyInfo.CanRead){return?propertyInfo.GetIndexParameters().Length?==?0;}return?false;}return?true;});}try{return?expressions.Select(GetAccessedMember);}catch?(ArgumentException?innerException){throw?new?ArgumentException("One?of?the?supplied?expressions?is?not?allowed.",?"expressions",?innerException);}MemberInfo?GetAccessedMember(LambdaExpression?lambda){Expression?expression?=?lambda.Body;if?(expression.NodeType?==?ExpressionType.Convert?||?expression.NodeType?==?ExpressionType.ConvertChecked){expression?=?((UnaryExpression)expression).Operand;}MemberExpression?memberExpression?=?expression?as?MemberExpression;if?(memberExpression?==?null?||?memberExpression.Expression.NodeType?!=?ExpressionType.Parameter){throw?new?ArgumentException($"Illegal?expression:?{lambda}",?"lambda");}return?memberExpression.Member;} }

從上面源碼大概可以看到,將 List 轉(zhuǎn)成 DataTable 支持兩種方式,要么反射,要么 Expression 解析樹,默認(rèn)用的是反射,性能要稍微低一點(diǎn)。

三:總結(jié)

當(dāng)然這里還有很多的擴(kuò)展方法,篇幅原因恕不能一一介紹,有興趣的朋友可以pull下來(lái)試一試,總的來(lái)說(shuō)這種工具類太棒了,讓我們可以更好的專注于業(yè)務(wù)。

總結(jié)

以上是生活随笔為你收集整理的Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费簧片在线观看 | 国产视频在线观看一区二区 | 好男人香蕉影院 | 久久综合88| 后入内射欧美99二区视频 | 国产精品黄色在线观看 | 亚洲精品一卡二卡 | 日韩毛片高清在线播放 | 亚洲一区二区在线看 | 亚洲国产第一页 | 激情开心成人网 | 福利二区 | 97福利社 | 免费日韩在线视频 | 日韩国产在线播放 | 国产永久免费 | www.白浆 | 你懂的在线免费观看 | 欧美性猛交 xxxx | 欧美裸体xxx| 国产精品久久AV无码 | 国产高清免费视频 | 在线观看麻豆av | 高h调教冰块play男男双性文 | 狠狠干在线观看 | www.日本高清 | 绯色av一区二区三区高清 | 九九九九精品九九九九 | 中国av一区| 乱子伦一区 | 精品一二三 | 虫族全黄h全肉污文 | 国产精品午夜福利 | 国产一区二区三区高清 | 日韩一区二区视频在线 | 国产精品无码专区av在线播放 | 日韩视频在线一区 | 一级日批片 | 国产成人一区二区三区别 | 黄色第一网站 | 欧美人与性动交α欧美片 | 欧美成人一区二免费视频软件 | 婷婷亚洲综合五月天小说 | 欧美一级不卡 | 亚洲最新在线 | av卡一卡二| 日韩福利在线播放 | 木木影院 | 干干天天| 国产午夜性春猛交ⅹxxx | 久久久久久久久久一区二区三区 | 成人一区在线观看 | 免费的一级黄色片 | 在线观看免费毛片 | 国产精品高潮呻吟久久久 | 天天操天天射天天爱 | 深夜av在线| 欧美又粗又长又爽做受 | 免费在线观看黄色网址 | 韩国三级hd中文字幕的背景音乐 | 中文字幕欲求不满 | 欧美少妇毛茸茸 | 精品少妇无码av无码专区 | 日本xx视频免费观看 | 91视频在线免费 | 久久性生活片 | 国产一区二区三区麻豆 | 北条麻妃青青久久 | 亚洲国产精品久久久久久6q | 国产精品呻吟久久 | 一区二区三区观看 | 免费看欧美黄色片 | 老司机精品视频网站 | 久久久久久久麻豆 | 成人在线午夜 | 国产一区精品在线 | 日韩有码在线视频 | 中文字幕免费观看 | 草草视频在线免费观看 | 国产偷拍一区二区 | 亚洲视频图片 | 欧美成人黑人猛交 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 天天操穴 | 久久8| 日韩一级色 | 婷婷久久久久久 | 亚洲AV无码一区二区三区性 | 少妇人妻真实偷人精品视频 | 欧美一区二区三区激情视频 | 草草草在线观看 | 97人妻精品一区二区三区视频 | 亚洲综合久久av一区二区三区 | 亚洲精品国产精品国自产 | 国产精品久久久久久久无码 | 国产午夜成人久久无码一区二区 | 黄色免费看网站 | 极品少妇xxxx精品少妇 | 国产精品久久久久久久久久久久久 |