c# - Linq 中的 Union Vs Concat

标签 c# linq

我有关于 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 时,引用不会更改。

如果您将覆盖 EqualsGetHashCode(用于选择不同的项目),则不会通过引用比较项目:

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 的项目,那么您将看到 UnionConcat 之间的区别:

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/

相关文章:

c# - 如何在 ODataQueryOptions 上启用 $expand 和 $select?

c# - 从 IEnumerable 转换为 IEnumerable<object>

c# - 获取特定类型的对象

c# - System.Xaml 和 System.Windows.Markup 的 Xaml 阅读器之间的区别?

c# - 为什么有时我必须通过引用传递一个类,而有时却不需要?

c# - LINQ 子查询

c# - 如何等待 Parallel Linq 操作完成

c# - 如何将代理与 TcpClient.ConnectAsync() 一起使用?

c# - Chrome驱动Selenium下载位置

c# - 如何使用 Elasticsearch NEST APIs UpdateAsync 方法将值更新为 null?