一般检查 null 不会将非约束类型上的 null 值装箱。

2024-01-05

假设我有以下方法:

public static int CountNonNullMembers<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null) throw new ArgumentNullException("enumerable");
    int count = 0;
    foreach (var x in enumerable)
    {
        if (x != null) count++; 
    }
    return count;
}

我有这 3 个数组::

var ints = Enumerable.Range(0,10).ToArray();
var nullableInts = Array.ConvertAll(ints,x=>x as int?);
var strings = Array.ConvertAll(ints,x => x.ToString());

我编写了一个小函数来执行循环并为其计时一百万次迭代。将其应用到ints and strings,在我的机器上大约需要 100 毫秒即可完成。为了nullableInts,需要2.5秒。 据我了解,检查空值int没有意义,因此编译器对于不可为空有不同的模板struct类型,删除空检查。但Nullable<T>没有将空检查转换为的模板x.HasValue。如果我有一个不受约束的函数,如何进行空检查以使其性能良好?我不能使用EqualityComparer<T>,因为 null 可能不是以下成员T因为没有任何限制。

而且不可能有因约束而异的重载,所以我不能,比如说,有一个structs, 一个用于Nullable<T>,还有一个用于课程。

该方法的调用者是不受约束的。这只是一个示例(不是实际方法);方法调用是不受约束的。我需要对非空成员做一些工作,这是一个通用方法。我想我可以编写一个不进行检查的版本与进行检查的版本(因此具有不同的签名),但它看起来非常丑陋且不需要。

另外,扩展方法.Count莫名其妙地表现得很糟糕NullableInts and strings,(同样糟糕),所以这确实不是正确的方法。这可能是委托调用,但我对此表示怀疑。使用UnboxT风格方法Check<T>.IfNull表现好多了。 好吧,真的很奇怪,将计数主体切换到这个效果很好:

    public static int CountNonNullMembers<T>(this IEnumerable<T> enumerable)
    {
        return enumerable.Count(Check<T>.IfNull.Invoke);
    }

Why?


You can 约束泛型类型参数 http://msdn.microsoft.com/en-us/library/d5x73970.aspx引用类型或值类型:

public static int CountNonNull<T>(this IEnumerable<T> source)
    where T : class
{
    return source.Count(x => x != null);
}

public static int CountNonNull<T>(this IEnumerable<Nullable<T>> source)
    where T : struct
{
    return source.Count(x => x.HasValue);
}

您不需要对不可为 null 的结构进行重载,因为它们无论如何都不能为 null。

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

一般检查 null 不会将非约束类型上的 null 值装箱。 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 如何在c中读取图像的像素?

    假设我们的位图图像具有高度 M 和宽度 N 我们总是假设 在本实验中 宽度 N 是 4 的倍数 这简化了 文件中的字节布局 对于该图像 像素数组存储 正好 3 x N x M 字节 如下所示 每组 3 个字节代表一个像素 其中字节存储 按顺
  • 如何在 main 中设置 Nimbus 外观

    我刚刚学习Java 仍然无法解决我遇到的这个小问题 我的弹出日历使用 Nimbus 外观和感觉 但我有使用 Java 外观和感觉的面板和容器 Jtable 我试图使每个 GUI 屏幕 窗口都使用 Nimbus 外观和感觉 Merky 建议将
  • 从 numpy 数组到 DICOM

    我的代码读取 DICOM 文件 将像素信息放入 numpy 数组 然后修改 numpy 数组 它使用列表是因为我试图同时操作多个 DICOM 文件 我还没有找到任何关于如何获取修改后的 numpy 数组并再次使其成为 DICOM 文件的信息
  • 通过 Windows API 检索 PCI 坐标(用户模式)

    有没有办法使用 Windows c c API 例如 PnP Configuration Manager API 获取设备的 PCI 坐标 总线 插槽 功能号 我已经知道如何在内核模式下执行此操作 我需要一个用户模式解决方案 我的目标系统是
  • 在“for”循环中递增 1 时格式化背后的技术原因?

    整个网络上都有代码示例for循环看起来像这样 for int i 0 i lt 5 i 当我使用以下格式时 for int i 0 i 5 i 我这样做是因为我相信这样会更有效率 但是在大多数情况下这真的很重要吗 每个人都喜欢他们的微观优化
  • 使用来自 json 文件的字符串将字符串数组传递给 React 组件,并允许内联 span 标签

    我正在尝试获取一个字符串数组来显示为段落 并允许在这些字符串内使用内联跨度标签 我的问题是 当在段落内添加值时 会将 标记的开头和结尾解码为其解码值 有没有一种简单的方法可以使其工作而无需为此情况制作特定组件 我的React组件如下 con
  • 从 Flask 运行 Scrapy

    我有这个文件夹结构 app py flask app app datafoo scrapy cfg crawler py blogs pipelines py settings py middlewares py items py spid
  • boto3 s3 对象过期“MalformedXML”错误

    我尝试使用以下命令设置 Amazon S3 存储桶中子目录的生命周期配置boto3 put bucket lifecycle configuration 我使用了这段代码AWS 文档 https docs aws amazon com co
  • 在图形之间移动或复制补丁

    如何在图形之间移动 或复制 补丁matplotlib 我正在处理一组腌制的人物 并想将它们合并到一个情节中 使用线图时这没有问题 因为我可以通过以下方式访问数据ax get lines 然而 在使用直方图时 ax get lines回报 a
  • 在主页小部件中使用 ScrollView 时出现问题

    我能够在应用程序的布局 xml 文件中成功使用 ScrollView 但是 当我尝试在小部件的布局 xml 文件中使用 ScrollView 时 一旦将小部件放入模拟器中 就会收到 加载小部件时出现问题 错误 如果我注释掉 ScrollVi
  • 是否可以禁用在页面中查找的 Ctrl + F 功能?

    我有一个拼图网站 这是一种可怕的作弊方式 只做一部分也可以 但是能做到吗 我的想法是用图像替换字母 但还有比这更简单的吗 Code window addEventListener keydown function e if e keyCod
  • 按 ID 划分的行频率

    数据集包含三个变量 id 性别和年级 因素 mydata lt data frame id c 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 sex c 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1
  • 将信息从一个 jframe 传递到另一个 jframe

    首先 我知道使用多个 jframe 是不受欢迎的 不幸的是我已经深入到这个项目中来重新开始 我的问题是我找不到一种方法将数据 用户输入 从一个帧传输到另一个帧 我将提供需要从帧 1 传输到另一个帧的代码 这是我的代码 用于他们必须输入的姓名
  • C++ 到 chrono::duration 的转换运算符 - 适用于 c++17,但不适用于 C++14 或更低版本

    以下代码使用带有 C 17 集的 gcc 7 1 0 进行编译 但不使用 C 14 集 或 Visual Studio 2017 进行编译 很容易重现Wandbox https wandbox org permlink b8QJGuSPUc
  • 尝试在 Android 中传输 IP 摄像头时黑屏

    我正在开发一个 Android 应用程序来监控一些 IP 摄像机 我正在使用MjpegView 类 http code google com p android camera axis source browse trunk sereali
  • Fortran 格式 1P10E11.3

    有谁知道这个格式行在 fortran 中的含义 FORMAT 1x F7 0 2x 1P10E11 3 我知道第一部分是浮点数的一次重复 但我不明白第二部分中读取了多少指数数据点以及 P 的用途 The P格式会移动小数点 输入和输出的行为
  • SQL Server 2008 分区表和并行性

    我的公司正在迁移到 SQL Server 2008 R2 我们有一个包含大量存档数据的表 大多数使用此表的查询都在 where 语句中使用 DateTime 值 例如 Query 1 SELECT COUNT FROM TableA WHE
  • 使用 python 的正则表达式比较和提取字母字符

    您好 我有一个数据集 如下所示 Format Message time A ab 1 yl 5 rd 20 pp 40 3 B bc 1 gn 7 yl 20 ss 25 rd 50 21 C cc 1 yl 9 rd 20 22 我想使用
  • 在 Android 中创建菜单

    我是Android应用程序开发的新手 我想开发一个简单的Android应用程序 其中包含菜单 互联网上有源代码吗 任何人都可以告诉我我应该如何追求 提前致谢 图沙尔 您需要了解的一切都在Android 开发指南 http developer
  • 一般检查 null 不会将非约束类型上的 null 值装箱。

    假设我有以下方法 public static int CountNonNullMembers