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

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

生活随笔

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

编程问答

NET问答: 对 Linq 中的 Union 和 Concat 的用法困惑

發(fā)布時(shí)間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答: 对 Linq 中的 Union 和 Concat 的用法困惑 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咨詢區(qū)

Prasad Kanaparthi

我在使用 Union 和 Concat 上有一個(gè)困惑,從字面上理解:一個(gè)是并集,一個(gè)是連接,下面的例子就是我對(duì)這兩個(gè)擴(kuò)展方法的理解。

static?void?Main(string[]?args){var?a1?=?(new[]?{?1,?2?}).Union(new[]?{?1,?2?});var?a2?=?(new[]?{?1,?2?}).Concat(new[]?{?1,?2?});var?a3?=?(new[]?{?"1",?"2"?}).Union(new[]?{?"1",?"2"?});var?a4?=?(new[]?{?"1",?"2"?}).Concat(new[]?{?"1",?"2"?});Console.WriteLine($"a1={string.Join(",",?a1)}");Console.WriteLine($"a2={string.Join(",",?a2)}");Console.WriteLine("---------------------------");Console.WriteLine($"a3={string.Join(",",?a3)}");Console.WriteLine($"a4={string.Join(",",?a4)}");Console.ReadLine();}

現(xiàn)在問(wèn)題來(lái)了,為什么我切換到 List<T> 上卻是不同的表現(xiàn)呢?參考下面的代碼。

class?Program{static?void?Main(string[]?args){var?lstX1?=?new?List<X1>?{?new?X1?{?ID?=?10,?ID1?=?10?},?new?X1?{?ID?=?10,?ID1?=?10?}?};var?lstX2?=?new?List<X2>?{?new?X2?{?ID?=?10,?ID2?=?10?},?new?X2?{?ID?=?10,?ID2?=?10?}?};var?a5?=?lstX1.Cast<X>().Union(lstX2.Cast<X>());var?a6?=?lstX1.Cast<X>().Concat(lstX2.Cast<X>());Console.WriteLine($"a5.Count={a5.Count()},?a6.Count={a6.Count()}");Console.ReadLine();}}class?X{public?int?ID?{?get;?set;?}}class?X1?:?X{public?int?ID1?{?get;?set;?}}class?X2?:?X{public?int?ID2?{?get;?set;?}}

為什么結(jié)果是兩個(gè) 4 呢 ?給個(gè)建議吧 ????

回答區(qū)

Sergey Berezovskiy

Union 返回的是 Distinct 的值,默認(rèn)情況下會(huì)比較這些 items 的引用,你的 items 其實(shí)都是不同的引用值,即使你轉(zhuǎn)成基類 X,引用值也不會(huì)被改變。

如果你重寫了 item 的 Equals 和 GetHashCode 的話,那么 items 之間的比較就不會(huì)按照默認(rèn)的引用比較了,參考如下代碼。

class?X {public?int?ID?{?get;?set;?}public?override?bool?Equals(object?obj){X?x?=?obj?as?X;if?(x?==?null)return?false;return?x.ID?==?ID;}public?override?int?GetHashCode(){return?ID.GetHashCode();} }

可以再次運(yùn)行一下,你將會(huì)看到 Union 和 Concat 不同的表現(xiàn)啦。

點(diǎn)評(píng)區(qū)

這道題感覺(jué)可以做面試題,挺有意思的,用了一個(gè)障眼法,以為都轉(zhuǎn)成基類 X 就可以瞞過(guò) CLR 了,有點(diǎn)自作聰明哈????,對(duì)象從生下來(lái)的那一刻起,他就有專屬的內(nèi)存地址啦。。。(不討論GC壓縮????)

總結(jié)

以上是生活随笔為你收集整理的NET问答: 对 Linq 中的 Union 和 Concat 的用法困惑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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