我有关于 Union
的问题和 Concat
.
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"
以上结果是预期的,但在 List<T>
的情况下我从两个 Union
得到相同的结果和 Concat
.
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
但两者在 List<T>
情况下表现相同.
有什么建议吗?
最佳答案
联合返回 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();
}
}
但是您所有的项目都有不同的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
您的初始示例有效,因为整数是值类型并且它们按值进行比较。
关于c# - Linq 中的 Union Vs Concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13417556/