有没有办法调用需要 IEnumerable 且具有单个值的 C# 方法? ...通过基准测试[重复]

2024-06-28

我只是想知道我是否错过了一些语法糖或微优化...... 如果我调用一个需要 IEnumerable 值的方法,但我只有一个值,那么我将该单个值放入一个数组中。 例如:

var x = 1.23;
SquareAllTheNumbers(new[] { x });


private void SquareAllTheNumbers(IEnumerable<double> values)
{
    foreach (var value in values)
    {
        Console.WriteLine(Math.Sqrt(value));
    }
}

即使不需要,这也需要创建一个数组。看来我应该能够写出类似的东西:

var x = 1.23;
SquareAllTheNumbers(yield x);

有没有一种方法可以在不创建数组的情况下调用该函数?

[EDIT]感谢您的快速回复。因此,我了解到,有四种解决方案,如下所示以及过去的相同问题(将单个项目作为 IEnumerable 传递 https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet)。我当然喜欢额外的收益方法,并且不需要生成新的数组,但它更好吗?嗯,我一直想了解有关 Benchmark.NET 的更多信息,所以我决定测试这四个想法。这些都是:

  1. 制作一个数组(new[] { x } )
  2. 产量法
  3. 可枚举.重复
  4. 参数双[]

这些可以在下面的代码中更好地理解:

        [Benchmark(Description = "Array Approach")]
        public double ArrayApproach()
        {
            var x = 1.23;
            return SumOfSquaredNumbers(new[] { x });
        }

        [Benchmark(Description = "Yield Method Approach")]
        public double YieldMethodApproach()
        {
            return SumOfSquaredNumbers(Yield(x));
        }

        [Benchmark(Description = "Enumerable Repeat Approach")]
        public double RepeatMethodApproach()
        {
            return SumOfSquaredNumbers(Enumerable.Repeat(x, 1));
        }
        [Benchmark(Description = "Params Approach")]
        public double ParamsApproach()
        {
            return SumOfSquaredNumbers(x);
        }

        private double SumOfSquaredNumbers(IEnumerable<double> values)
        {
            var result = 0.0;
            foreach (var value in values)
            {
                result = value * value;
            }

            return result;
        }
        private double SumOfSquaredNumbers(params double[] values)
        {
            var result = 0.0;
            foreach (var value in values)
            {
                result = value * value;
            }

            return result;
        }

        public IEnumerable<T> Yield<T>(T item)
        {
            yield return item;
        }

这是基准测试的结果:

|                       Method |      Mean |      Error |    StdDev |  Gen 0 | Allocated |
|----------------------------- |----------:|-----------:|----------:|-------:|----------:|
|             'Array Approach' |  6.970 ns | 10.7471 ns | 0.5891 ns | 0.0076 |      32 B |
|      'Yield Method Approach' | 30.256 ns | 21.7358 ns | 1.1914 ns | 0.0114 |      48 B |
| 'Enumerable Repeat Approach' | 30.058 ns | 32.9930 ns | 1.8085 ns | 0.0095 |      40 B |
|            'Params Approach' |  5.330 ns |  0.6169 ns | 0.0338 ns | 0.0077 |      32 B |

所以,看起来最好的方法就是创建一个新数组。第四个选项(使用params double[]) 表现良好,但这有点超出了问题的范围,因为我的意思是该方法是“一成不变”的 - 例如,第 3 方 DLL 的一部分。


数组是一个具体的实现IEnumerable,所以我认为创建一个来传递值并没有什么错。

如果你追求语法糖,你可能会超载params参数,这意味着编译器将负责为您创建一个数组:

private static void SquareAllTheNumbers(params double[] values) {
    foreach (var value in values) {
        Console.WriteLine(Math.Sqrt(value));
    }
}

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

有没有办法调用需要 IEnumerable 且具有单个值的 C# 方法? ...通过基准测试[重复] 的相关文章

  • 预加载整个模型以估计 Tensorflow Serving 的内存消耗

    当执行预测时 Tensorflow Serving 延迟初始化模型 DAG 中的节点 这使得很难估计保存整个模型所需的内存 RAM 是否有一种标准方法可以强制 Tensorflow Serving 将模型完全初始化 加载到内存中 您可以使用
  • CodeLite 配色方案(主题)对于 C 来说很混乱

    我最近将 CodeLite for Linux Debian 更新到版本 14 0 我主要将 CodeLite 用于 C 看起来 IDE 搞乱了颜色主题 这里我有之前 CodeLite 13 0 https i stack imgur co
  • 将 Google 云端硬盘访问权限委派给服务帐户失败

    我参与构建了一个内部使用的应用程序 用户可以通过该应用程序上传文件 并将其存储在 Google Drive 中 由于建议不要使用服务帐户作为文件所有者 因此我希望代表公司系统管理员有权访问的指定用户帐户上传应用程序 我已经创建了该应用程序以
  • 信用卡号应该存储为字符串还是整数?

    是啊 只是想想而已 我应该将在我的网站上输入的信用卡号存储为字符串还是整数 我的意思是 它们由数字组成 这让我认为它是一个整数 但我不对它们进行数学运算 所以也许字符串更合适 编辑 所以我必须在加密之前存储在某个时刻输入的数字 我可能应该更
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • 在 C 中使用模板函数的最短示例?

    我如何处理函数echo tpl可以采取1类型参数int or string 然后打印出来 C没有模板 我认为你能做的最好的事情就是使用联合或让函数具有不同的名称 后一种具有不同名称的方法是准标准方法 例如fabs fabsf fabsl a
  • 即使指定了标头,g++ 也找不到标头

    所以基本上我有一些非常简单的代码 其中包括
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • 带和不带指针声明符的 C++11 自动声明

    不同类型有什么区别bar1 and bar2 int foo 10 auto bar1 foo auto bar2 foo If both bar1 and bar2 are int 编写指针声明符是否有意义 在里面bar2宣言 这些声明完
  • StreamReader 的默认值是多少?

    我需要使用这个构造函数public StreamReader Stream stream Encoding encoding bool detectEncodingFromByteOrderMarks int bufferSize bool
  • 使用自定义对象的动态列表并且无法动态更改dataGrid的单元格属性

    我刚开始在 Stack 上发帖 我已经搜索了很长一段时间来解决与我类似的问题 我试图根据对象的布尔值动态地将 WinForms DataGridView 中的复选框从非只读更改为只读 它在调试模式下显示更改已经发生 但是一旦完全运行 应该只
  • 编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的

    下面的代码演示了我无法解释的 gcc 4 6 2 的行为 第一个函数声明一个 vec t 类型的静态数组 其中 vec t 是 unsigned char 的 typedef 别名 第二个函数是相同的 只是 vect t 的类型是模板参数
  • WCF:通用接口的序列化可能吗?

    我正在尝试实现一个服务契约 其中包含一个采用通用接口的方法 并且该通用接口本身被赋予一个接口参数 我用 ServiceKnownType 装饰了服务接口 用常规 KnownType 装饰了服务实现 并用常规 KnownType 装饰了数据契
  • 开始学习 C# 的最佳方式是什么?

    我对 vb 6 有一点编程经验 而 vb net 则不多 请告诉我成为专家 C 程序员的最佳方法 我知道这需要很长时间 想想你如何学习人类语言 阅读 写作 口语和听力 阅读代码 阅读文章 阅读示例 当您更有经验时 请查看您使用的一些项目的源
  • Linux 相当于 GetCommandLine 和 CommandLineToArgv?

    我想知道是否有一些 API 可以在 Linux 上获取当前进程的命令行参数 我想我是非常不清楚的 该问题的真正目的是通过命令行参数传递 unicode 文件名 从文件中读取 proc self cmdline 例如 wallyk zf od
  • 我不明白这个霍夫曼算法的实现

    template
  • 对双向链表进行排序 C++

    尝试通过遍历列表的循环来完成此操作 在循环中 我将头节点输入到我定义的排序函数中 然后使用 strcmp 来确定节点中的哪个名称是否应该排在前面 它不起作用 因为写得太早了 我通过一次沿着列表一个节点进行线性比较 而不是回去查看第一个节点是
  • 检测非 DPI 感知应用程序是否已扩展/虚拟化

    我正在尝试在 WinForms 应用程序中检测它是否由于操作系统具有高 DPI 而以缩放 虚拟化模式启动 目前 在以 3840x2400 缩放 200 缩放运行的系统中 应用程序将分辨率视为 1920x1200 DPI 为 96 缩放因子为
  • 如何在C++中动态调用函数

    除了 boost Bind Function 之外 我如何在 C 中动态调用函数 PHP has obj new MyObject function doSomething obj gt function Objective C 有 MyO
  • C# 固定长度的字符串对象

    我有一堂课 我想使用固定大小的字符串 固定大小的原因是该类 序列化 为文本文件 具有固定长度的值 我想避免为每个值编写一个保护子句 而是让类处理它 所以我有大约 30 个属性 看起来像这样 public String CompanyNumb

随机推荐

  • 如何正确并行化严重依赖 I/O 的作业

    我正在构建一个必须处理大量数据的控制台应用程序 基本上 应用程序从数据库获取引用 对于每个引用 解析文件的内容并进行一些更改 这些文件是 HTML 文件 该过程正在使用 RegEx 替换进行繁重的工作 查找引用并将其转换为链接 然后结果存储
  • 如何订阅所有进程的PROCESS_STATE_RUNNING事件

    我在用着主管的事件框架 http supervisord org events html订阅由 Supervisor 管理的进程的事件 我的事件监听器 processlistener py 看起来像这样 import sys from su
  • 在express中设置静态javascript文件的内容类型

    我在用express使用 es6 模块提供带有 js 文件的页面 关于 es6 模块 https jakearchibald com 2017 es modules in browsers https jakearchibald com 2
  • 有没有办法在不同选项卡之间隔离“localStorage”?

    我目前正在使用 window localStorage 在浏览器上存储一些客户端数据 但我想将此存储隔离到各个选项卡 有办法实现这一点吗 你应该考虑使用会话存储 https developer mozilla org en US docs
  • Flexslider 在循环后停在第一张幻灯片处

    我试图让 Flexslider 进行完整循环 然后在返回到第一张幻灯片后停止或暂停 到目前为止 这是我的代码 window load function flexslider flexslider animation slide animat
  • 打印字符串有困难

    当我运行该程序时 第二个printf prints string2与扫描到的任何内容string1附在最后 e g 123被扫描到string1然后它打印 Is before 12ab123 相对于12ab 为什么不只是 12ab char
  • 测试舵图模板

    有没有办法测试模板是否适用于所有可能的值 注意 这与 helm 测试不同 helm 测试用于通过作业中运行的任意代码来测试已部署的图表 我想要实现的是迭代一组值并检查每个值生成的 K8s 资源 假设我们要测试您的图表是否正确编写 图表 值
  • 格式化浮点值,保留 2 位小数[重复]

    这个问题在这里已经有答案了 如何将结果四舍五入到小数点后两位并将其显示在结果标签上 我发现了一些陈述 但我对 Swift 很陌生 实际上我很难为我的项目重建示例 import UIKit class ViewController UIVie
  • 在 docker 中为 docker golang api 的容器设置端口

    我期待使用 docker golang api 做下面这样的事情 cmd docker run t i p 8989 8080 image name bin bash 我也在使用golang sdkhttps github com moby
  • 如何在 Spring Boot Health 中添加自定义健康检查?

  • 如何创建独立的电梯 Web 应用程序?

    如何制作独立的电梯应用程序 使用哪些工具 库 与在某些应用程序服务器中使用 lift 应用程序作为战争相比 性能如何 使用 onejar maven 插件http onejar maven plugin googlecode com svn
  • 创建视图中可用的自定义助手

    我有太多文本实用方法 例如MakeShortText string text int length RemoveTags string text TimeAgo DateTime date 和别的 我想从单独的助手访问它们 如下一个示例所示
  • Visual Studio Code - 基于 .gitignore 自动排除

    我希望 VSCode 根据我的情况自动排除文件 文件夹 gitignore配置 对于资源管理器排除 我找到了一个扩展 explorer excluded files它管理着files exclude设置 但对于快速打开文件 cmd p 我什
  • GitHub 的 README 支持哪些文件类型

    我注意到 GitHub README 使用了许多不同的文件类型 最常见的是 md and rst 查看 GitHub 文档和帮助页面后 我没有找到有关允许哪些文件类型的信息 我只是在寻找类型列表 以便我可以找出可以在下一个自述文件中使用哪些
  • AngularJS 与 Apache Tiles

    我在我的项目中使用 Spring MVC 和 AngularJS AngularJs 可以吗 routing和 ngView 被用来代替or与阿帕奇瓷砖框架 据我所知 使用 routing 和 ngView 我们创建模板并在单页应用程序中重
  • 使用 CSS2 将

    有没有一个好的跨浏览器解决方案来拆分单个 ul 分成两列 或者最好的方法仍然是使用两个相邻浮动的单独列表 我正在寻找单一的解决方案 因此如果需要替代 HTML 来支持旧版浏览器 则不允许使用 CSS3 优点 要求浏览器支持IE7 FF3 我
  • Elasticsearch 主分片不平衡

    我注意到我的 elasitcsearch 集群中有一个奇怪的行为 正如您在下面的屏幕截图中看到的 它显示了 kopf 插件 大多数主分片位于 nl 1 服务器上 我认为 elasitcsearch 在所有服务器上均匀地平衡了主分片 我错了吗
  • 如何反转 TextView 选取框的方向

    我想反转 TextView 中选取框的方向 默认情况下 文本从右向左移动 我希望它从左向右移动 我怎样才能做到这一点 我想出了一个非常简单易行的方法来做到这一点 我制作了一个选框效果 根据我们的选择向两个方向移动 所以 这里有一个技巧 我在
  • 在一项服务中引用多个 API 调用 (Angular)

    我正在通过 Angular http 请求访问 API 以收集不同足球队的信息 如果我只访问一个团队 那就没问题了 我将创建一个进行调用的服务 然后在我的控制器中引用该服务函数 但是 我希望在多个团队中执行此操作 而不必为每个团队创建单独的
  • 有没有办法调用需要 IEnumerable 且具有单个值的 C# 方法? ...通过基准测试[重复]

    这个问题在这里已经有答案了 我只是想知道我是否错过了一些语法糖或微优化 如果我调用一个需要 IEnumerable 值的方法 但我只有一个值 那么我将该单个值放入一个数组中 例如 var x 1 23 SquareAllTheNumbers