I have a question on Union and Concat. I guess both are behaving same in case of List<T> .
var a1 = (new[] { 1, 2 }).Union(new[] { 1, 2 }); // O/P : 1 2
var a2 = (new[] { 1, 2 }).Concat(new[] { 1, 2 }); // O/P : 1 2 1 2
var a3 = (new[] { "1", "2" }).Union(new[] { "1", "2" }); // O/P : "1" "2"
var a4 = (new[] { "1", "2" }).Concat(new[] { "1", "2" }); // O/P : "1" "2" "1" "2"
Run Code Online (Sandbox Code Playgroud)
The above result are expected,
But Incase of List<T> I am getting same result.
class X
{
public int ID { get; set; }
}
class X1 : X
{
public int ID1 { get; set; }
}
class X2 : X
{
public int ID2 { get; set; }
}
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>()); // O/P : a5.Count() = 4
var a6 = lstX1.Cast<X>().Concat(lstX2.Cast<X>()); // O/P : a6.Count() = 4
Run Code Online (Sandbox Code Playgroud)
But both are behaving the same incase of List<T>.
Any suggestions please?
Ser*_*kiy 98
联盟返回Distinct值.默认情况下,它将比较项目的引用.您的商品有不同的参考,因此它们都被认为是不同的.转换为基本类型时X,不会更改引用.
如果您将覆盖Equals和GetHashCode(用于选择不同的项目),则不会通过引用比较项目:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是你所有的物品都有不同的价值ID.所以所有项目仍然被认为是不同 如果您将提供几个相同的项目,ID那么您将看到Union和之间的区别Concat:
var lstX1 = new List<X1> { new X1 { ID = 1, ID1 = 10 },
new X1 { ID = 10, ID1 = 100 } };
var lstX2 = new List<X2> { new X2 { ID = 1, ID2 = 20 }, // ID changed here
new X2 { ID = 20, ID2 = 200 } };
var a5 = lstX1.Cast<X>().Union(lstX2.Cast<X>()); // 3 distinct items
var a6 = lstX1.Cast<X>().Concat(lstX2.Cast<X>()); // 4
Run Code Online (Sandbox Code Playgroud)
您的初始样本有效,因为整数是值类型,它们按值进行比较.
Raw*_*ing 46
Concat从字面上返回第一个序列中的项目,然后是第二个序列中的项目.如果您使用Concat两个2项目序列,您将始终获得一个4项目序列.
Union基本上是Concat跟着Distinct.
在前两种情况下,最终会得到两项序列,因为在它们之间,每对输入序列都有两个不同的项目.
在第三种情况下,最终得到一个4项序列,因为两个输入序列中的所有四个项都是不同的.
Tim*_*ter 13
Union并且Concat行为相同,因为Union没有自定义无法检测重复项IEqualityComparer<X>.它只是看两者是否是相同的参考.
public class XComparer: IEqualityComparer<X>
{
public bool Equals(X x1, X x2)
{
if (object.ReferenceEquals(x1, x2))
return true;
if (x1 == null || x2 == null)
return false;
return x1.ID.Equals(x2.ID);
}
public int GetHashCode(X x)
{
return x.ID.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以在重载中使用它Union:
var comparer = new XComparer();
a5 = lstX1.Cast<X>().Union(lstX2.Cast<X>(), new XComparer());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63315 次 |
| 最近记录: |