Linq 中的 Union 与 Concat

2024-01-14

我有一个问题Union and 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 and 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 and 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 and 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

您的初始示例有效,因为整数是值类型,并且它们是按值进行比较的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linq 中的 Union 与 Concat 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • selenium PhantomJS send_keys 不起作用

    我正在使用 selenium 和 PhantomJS 进行测试 我遵循了 Selenium 的简单用法 但是 send keys 不适用于 PhantomJS 它适用于 Firefox 为什么 我必须使用button click 反而 us
  • Django 验证错误

    根据https docs djangoproject com en dev ref forms validation https docs djangoproject com en dev ref forms validation Good
  • Ruby 解释器 (CUI) 1.9.2p180 [i386-mingw32] 已停止工作(我没有使用 MySQL)

    我的 ruby 解释器在几乎每个页面请求上都会崩溃 并出现以下错误 Ruby 解释器 CUI 1 9 2p180 i386 mingw32 已停止工作 我没有使用 MySQL 也没有安装 gem 因为许多在线帖子都建议这是一个潜在原因 我可
  • *nix 伪终端如何工作?什么是主/从通道?

    我想在 Linux 系统上用 C 语言编写一个简单 愚蠢的 X 终端模拟器 起初 我只是想我必须打开一个 shell 并显示其输出 我检查了xterm和rxvt代码 看起来有点复杂 首先 我必须使用 openpty 打开一个伪终端 所以我查
  • 将 1 到 32 位数字附加到字符缓冲区

    我有一个char 缓冲区 我想附加各种位大小的整数 在1 and 32 to 因此 我需要一个函数 void addBits char buffer int bits appended so far int object int objec
  • 追加 DOM 元素两次 (jQuery)

    有人可以解释为什么以下代码片段没有添加
  • 并发写入同一缓存行中的不同位置

    假设我有一个 C 11 应用程序 其中两个线程写入不同但邻近内存位置 使用指向原始类型的简单指针 我能否确定这两个写入最终都会进入内存 可能在两者都达到boost barrier http www boost org doc libs 1
  • Rabbitmq 使用 .NET 使用单个同步调用检索多条消息

    有没有办法使用 NET 使用单个同步调用来接收多条消息 我见过question https stackoverflow com questions 17005515 rabbitmq retrieve multiple messages u
  • 如何对 Rails 中 Prawnto 生成的 PDF 进行内联格式(粗体和下划线)?

    我在 Rails 应用程序中使用 Prawn 和 Prawnto 插件生成 PDF 文件 我创建一个带有标准文本区域的标准表单 并将其作为 PDF 文件的正文提交 但是 我需要能够使用以下方式格式化单词和句子 bold 强调 也许不同的字体
  • 受影响的行实体框架

    如何获取 SaveChanges 后受影响的行数 The 保存更改 http msdn microsoft com en us library bb336792 aspx方法返回所有已更改项目的 int MSDN 片段 返回值 类型 Sys
  • 在javascript中选择区域/矩形

    我需要通过鼠标在 HTML5 页面中选择一个区域 然后我将与该区域内的元素进行交互 一定有一种简单的方法可以做到这一点 但我找不到现成的任何东西 不幸的是 jquery UI 选择不起作用 因为它似乎只支持一个父元素 有没有现成的东西可以在
  • 如何以编程方式突出显示 UIButton?

    很多用户抱怨 iPhone 上的小 i 信息按钮很难触摸 好吧 很简单 我只是在它后面贴了一个又大又大的隐形按钮 即使你用最粗心的手指触摸也不会错过它 当你触摸它时 它就会执行 infoButtonAction 事实是 我想让信息按钮本身闪
  • 递归算法的空间复杂度

    我在一次面试中被问到 解决问题的有效方法是检查回文 现在我可以做两件事 从 i 0 开始到 i n 2 并比较第 i 个和第 n 个字符是否相等 我可以使用递归来检查第一个和最后一个是否相同 并且字符串的其余部分是否为回文 第二个是递归的
  • 垃圾收集机制如何工作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 用外行术语来说 垃圾收集机制是如何工作的 如何识别对象可用于垃圾回收 还有 做什么Reference Counting Mark an
  • 如何判断 Map 是否有默认值?

    有没有办法检查是否Map有定义的默认值吗 我想要的是相当于myMap getOrElse x y 如果关键在哪里x不在地图上 if myMap有默认值 返回该值 否则返回y 该问题的一个人为示例 scala gt def f m Map S
  • 如何在 MFC 应用程序中托管 WPF 表单

    我正在寻找有关在现有 MFC 应用程序中托管 WPF 表单的任何资源 谁能指出我如何做到这一点的正确方向 据我了解 我自己没有尝试过 这几乎就像将 WPF 控制权交给父级句柄一样简单 这是一个演练 在 Win32 中托管 WPF 内容 ht
  • 如何从.net core实体框架调用带有表值参数的存储过程

    我有一个带有表值参数的存储过程 我必须从 net core 中的实体框架调用它 我在上下文对象上找不到任何 API 我尝试过使用 ADO net API 它有效 但现在我必须从 net core 中的 EF 调用它 我必须调用的存储过程返回
  • PHP 多维数组访问

    假设我在 PHP 中有一个多维数组 例如 this array array string name gt string string array gt array string key gt string val 如何访问字符串数组键值对
  • XML 解析错误:文档末尾有多余内容

    我的 xml 文件中出现此错误 XML Parsing error Extra content at the end of the document 我正在使用 Notepad 它在标题标签中显示第二个红色单词
  • Linq 中的 Union 与 Concat

    我有一个问题Union and 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 Uni