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

咨询区

Prasad Kanaparthi

我在使用 UnionConcat 上有一个困惑,从字面上理解:一个是并集,一个是连接,下面的例子就是我对这两个扩展方法的理解。

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

现在问题来了,为什么我切换到 List<T> 上却是不同的表现呢?参考下面的代码。

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

为什么结果是两个 4 呢 ?给个建议吧 ????

回答区

Sergey Berezovskiy

Union 返回的是 Distinct 的值,默认情况下会比较这些 items 的引用,你的 items 其实都是不同的引用值,即使你转成基类 X,引用值也不会被改变。

如果你重写了 item 的 EqualsGetHashCode 的话,那么 items 之间的比较就不会按照默认的引用比较了,参考如下代码。


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

可以再次运行一下,你将会看到 UnionConcat 不同的表现啦。

点评区

这道题感觉可以做面试题,挺有意思的,用了一个障眼法,以为都转成基类 X 就可以瞒过 CLR 了,有点自作聪明哈????,对象从生下来的那一刻起,他就有专属的内存地址啦。。。(不讨论GC压缩????)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中止是怎么用的_多士炉怎么用 使用多士炉注意事项

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。 …

国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定

0、国内 GitHub 被爆造假&#xff0c;起底背后的黑色产业链作为全球最大的开源社区&#xff0c;GitHub 对于程序员群体而言像是空气般重要的存在&#xff0c;而互联网公司也会通过 GitHub 来进一步了解面试者的编程习惯&#xff0c;技术水平等。但最近知乎上有一篇《中国内地 G…

Azure data studio 跨平台数据库管理工具试用

最近折腾 azure sql database 的时候发现了微软的一款新的数据库管理工具&#xff1a;azure data studio。从名字上看 azure data studio 好像是专门为 azure 开发的&#xff0c;其实并不是这样的 。它同样支持对传统sql server的查询与管理。azure data studio 是一款跨平台数…

顺丰gis产品经理_线上面试季丰图科技—顺丰旗下专注GIS领域

WHITer内推——每天9点发布武汉优质互联网企业最新岗位内推机会。内推微信号&#xff1a;whxiaowai 内推邮箱&#xff1a;770554595qq.com01 Java高级开发工程师 12-25K点击查看职位详情 申请内推02高级python开发工程师 12-25K点击查看职位详情 申请内推03 物联网数据运营分析…

腾讯发布95页重磅报告:全面预测中国互联网未来5年趋势

腾讯科技企鹅智酷联合63位互联网行业领袖与专家发布了《企鹅智酷中国科技&互联网创新趋势白皮书&#xff08;2017&#xff09;》&#xff0c;预测了未来5年的中国互联网发展趋势。此次公开发布的版本共95页PPT&#xff0c;其中“移动直播产业”、“媒体与内容创业”、“互联…

.NET 6 平台系列1 .NET Framework发展历程

自1995年互联网战略日以来最雄心勃勃的事业 —— 微软.NET战略, 2000年6月30日。微软公司于2002年2月13日正式推出第一代.NET平台 .NET Framewrok 1.0。借助于自家强大易用的 Windows 系统&#xff0c;.NET Framework1.0 主要提供了面向 Windows 桌面&#xff08;Windows Form&…

3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析

报告编号&#xff1a;B6-2019-103101报告来源&#xff1a;360-CERT报告作者&#xff1a;360-CERT更新日期&#xff1a;2019-10-310x00 漏洞背景2019年9月6日18&#xff1a;00&#xff0c;exim发布exim-4.92.2版本修复了CVE-2019-15846&#xff0c;攻击者可以利用此漏洞远程获取…

jwt与token+redis,哪种方案更好用?

问&#xff1a;jwt与tokenredis&#xff0c;哪种方案更好用&#xff1f;其实JWT就是Json Web Token&#xff0c;就是Token的典型方式。题主的JWT和TokenRedis的区别&#xff0c;其实都是Token&#xff0c;只是JWT的可靠性保障是来源于加密算法(对称加密和非对称两种)&#xff0…

想不到吧?数学还有如此妙用!

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。对于大多数新手来说&#xff0c;弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等&#xff0c;都至关重要。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易…

ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!

技术在不断更新迭代&#xff0c;.NET 6 的正式版也即将正式发布&#xff0c;在.NET Core 开源项目方面&#xff0c;CMS的代表作是SiteServer&#xff0c;商城的开源系统有没有什么代表作&#xff1f;肯定是有的&#xff0c;强烈推荐这套开源免费的商城系统&#xff1a;nopComme…

Base PyQt4, Simple Web APP Framwork

长时间以来&#xff0c;一直针对Linux 服务器开发后台程序&#xff0c;每天面对的是黑框框&#xff0c;输出只有日志文件。偶尔需要模拟客户端测试&#xff0c;要么是写几行php代码&#xff0c;在浏览器上点一点&#xff0c;要么是写个小Python脚本在shell中执行一下。写了一些…

机器学习核心算法之——贝叶斯方法

1.贝叶斯公式贝叶斯公式已经成为机器学习的核心算法之一&#xff0c;诸如拼写检查、语言翻译、海难搜救、生物医药、疾病诊断、邮件过滤、文本分类、侦破案件、工业生产等诸多方面都有很广泛的应用&#xff0c;它也是很多机器学习算法的基础。在这里&#xff0c;有必要了解一下…

B 站面试官:“啥是重定向?”

三分钟&#xff0c;带你学习和实践域名重定向大家好&#xff0c;我是鱼皮&#xff0c;今天分享 重定向 小知识&#xff0c;以及我在腾讯云云开发中实现域名重定向的实践。孽起之前&#xff0c;我开发了一个编程导航网站&#xff0c;将网站放到了腾讯云云开发上&#xff0c;用云…

比起掉头发,我更怕掉队

程序员是最需要持续学习的职业可能在大家眼中&#xff0c;程序员是一群木讷、思维方式单一的物种&#xff0c;但其实&#xff0c;他们才是思维活跃&#xff0c;时刻保持学习力&#xff0c;不甘落后的一群人。计算机行业每天都会有新的东西出现&#xff0c;程序员们需要关注最新…

刷新mac地址命令_配置好Cisco交换机需要熟悉IOS命令及相关的知识

一、几种配置命令模式switch> 这种提示符表示是在用户命令模式&#xff0c;只能使用一些查看命令。switch# 这种提示符表示是在特权命令模式。switch(config)# 这种提示符表示是全局配置模式switch(config-if)# 端口配置命令模式二、检查、查看命令这些命令是查看当前配置…

WPF 使用FontAwesome字体图标

要搞点小软件&#xff0c;又不想使用图标和图标类库&#xff0c;突然想起FontAwesome,试了一下&#xff0c;还挺方便的&#xff0c;先弄了几个最常用的图标试一下&#xff0c;弄了几个按钮的样式&#xff0c;看一下效果&#xff1a;看一下fontAwesome使用方法&#xff1a;首先从…

从Google Maglev说起,如何造一个牛逼的负载均衡?

Maglev是谷歌为自己的数据中心研发的解决方案&#xff0c;并于2008开始用于生产环境。在第十三届网络系统设计与实现USENIX研讨会&#xff08;NSDI ‘16&#xff09;上&#xff0c; 来自谷歌、加州大学洛杉矶分校、SpaceX公司的工程师们分享了这一商用服务器负载均衡器Maglev的…

怎么打包图片_超简单的免费批量图片压缩技巧,只需3步

我们在上传图片的时候&#xff0c;经常会遇到一个问题&#xff0c;那就是图片文件太大&#xff0c;无法上传。那这个时候我们该怎么办呢&#xff1f;我们一般都会想到把图片进行压缩之后&#xff0c;重新上传。那么我们要怎么压缩图片呢&#xff1f;如果图片数量很多&#xff0…

Calendar类

接触java不久&#xff0c;感觉java真的挺好玩的。 Calendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段&#xff08;例如获得下星期的日期&#xff09;提供了一些方法…

史上最牛的5次黑客攻击!比电影还刺激!

好莱坞认为&#xff0c;黑客就像是使用计算机的黑魔导士。在电影中&#xff0c;计算机可以炸毁房屋&#xff0c;关闭公路&#xff0c;释放瘟疫还有引发女权运动。也许有人认为&#xff0c;好莱坞的想象力很丰满&#xff0c;但现实是骨感的。他们错了&#xff0c;因为在现实中&a…