泰兴市淘宝网站建设,指数 网站权重,优化员工,网页设计报告前言咨询区 Prasad Kanaparthi#xff1a;我在使用 Union 和 Concat 上有一个困惑#xff0c;从字面上理解#xff1a;一个是并集#xff0c;一个是连接#xff0c;下面的例子就是我对这两个扩展方法的理解。static void Main(string[] args){var a1 (new[] { 1, 2 }).Union(… 咨询区 Prasad Kanaparthi我在使用 Union 和 Concat 上有一个困惑从字面上理解一个是并集一个是连接下面的例子就是我对这两个扩展方法的理解。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();}现在问题来了为什么我切换到 ListT 上却是不同的表现呢参考下面的代码。class Program{static void Main(string[] args){var lstX1 new ListX1 { new X1 { ID 10, ID1 10 }, new X1 { ID 10, ID1 10 } };var lstX2 new ListX2 { new X2 { ID 10, ID2 10 }, new X2 { ID 10, ID2 10 } };var a5 lstX1.CastX().Union(lstX2.CastX());var a6 lstX1.CastX().Concat(lstX2.CastX());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 BerezovskiyUnion 返回的是 Distinct 的值默认情况下会比较这些 items 的引用你的 items 其实都是不同的引用值即使你转成基类 X引用值也不会被改变。如果你重写了 item 的 Equals 和 GetHashCode 的话那么 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();}
}可以再次运行一下你将会看到 Union 和 Concat 不同的表现啦。点评区 这道题感觉可以做面试题挺有意思的用了一个障眼法以为都转成基类 X 就可以瞒过 CLR 了有点自作聪明哈????对象从生下来的那一刻起他就有专属的内存地址啦。。。不讨论GC压缩????