从Dictionary中高效获取IReadOnlyDictionary

2023-12-23

public class Flea : Animals {...}

var fleas = new Dictionary<int, Flea>();

public IReadOnlyDictionary<string, Animal> Animals => fleas.ToDictionary(pair => pair.Key, pair => (Animal)pair.Value);

Q有没有更高效的获取方式Animals from fleas?


.NET 支持接口、委托、泛型类型和数组中的协变。接口或类型必须指定它的协变性out关键词。

你可以写

IEnumerable<Animal> animals=new List<Flea>();

or

var dict=new Dictionary<int,Flea>{
    [1]=new Flea()
};
IEnumerable<Animal> animals=dict.Values;

这有效是因为Dictionary.Values返回一个IEnumerable<Flea> and IE可枚举 https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1?view=netframework-4.8是协变的 - 它的定义是IEnumerable<out T>.

键值对 https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.keyvaluepair-2?view=netframework-4.8虽然不是协变的,这意味着使用它的类就像IDictionary<TKey,TValue> and IReadOnlyDictionary<TKey,TValue>也不是。这是故意的。

因为你只需要read从该字典中,您可以使用委托创建访问器方法,或者在 C# 7 及更高版本中使用本地函数创建访问器方法。您可以将该函数传递给期望的方法Func<TKey,TValue>并用它从字典中读取值。

如果您有一种需要基于密钥的访问的方法,可以这样说:

void Process(Func<int,Animal> reader)
{
    var value=reader(1);
}

在 C# 7 中你可以这样写:

var dict =...

Animal get(int key)=>dict[key];

Process(get);

通过使用变量捕获来访问字典,这有点作弊。

在 C# 7 之前,您可以使用委托:

Func<int,Animal> get= key=>dict[key];
Process(get);

这可能看起来很奇怪,但就是这样LINQ它本身是通过使用谓词和委托而不是接口和包装器来工作的。

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

从Dictionary中高效获取IReadOnlyDictionary 的相关文章

  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • 如何在 Flutter 中处理 Android 设备的 BACK 按钮按下?

    如何处理设备后退按钮onPressed Android 版 Flutter 中 我知道我必须为 iOS 手动添加一个后退按钮 但 Android 设备有内置的后退按钮 用户可以按下它 怎么处理呢 您可以使用WillPopScope为了达成这
  • 有没有办法在 r 中自动重新安装软件包及其依赖项?

    所以我在Rstudio上使用installR将R更新到版本4 0 0 并将我的包文件复制到R中的库文件中 目录是 C Users Ibrahim Documents R R 4 0 0 library 每当我调用一个包时 例如 tidyte
  • 在 Linux 命令行中使用低功耗蓝牙

    我正在研究在 Linux 上使用蓝牙低功耗调制解调器 我正在使用命令行选项 即hcitool 我可以使用以下命令找到设备 hcitool scan 它对我来说工作正常 我也可以使用以下方式广播我的设备 sudo hciconfig hci0
  • RecyclerView 中最后一个子元素的边距/填充

    我试图在最后一行添加填充 边距底部 并在第一行添加填充 边距顶部 我不能在项目 xml 中执行此操作 因为它会影响我所有的孩子 我的 RecyclerView 适配器中有标题和子项 所以我无法使用 android padding 4dp a
  • Django REST Framework 序列化速度极慢

    我使用的是 Python 2 7 和 Django 1 7 1 以及 django rest 框架 我有一个 API 它返回一些从数据库中获取的特定值 它使用如下所示的自定义序列化器 class InventarioSerializer s
  • 使用 MLCP 复制数据时出现异常

    我正在尝试使用 MLCP 将 100 万个文档从一个数据库复制到另一个数据库 但出现以下异常 19 08 30 11 48 08 ERROR contentpump DatabaseContentReader RuntimeExceptio
  • 我如何搜索文件并将它们压缩到一个 zip 文件中

    我尝试使用以下命令搜索文件并压缩它们 find regexpression exec zip 但是它不起作用 我怎样才能做到这一点 您使用的命令将分别对每个文件运行 zip 请尝试以下操作 find name
  • IIS 站点和 nant/nantcontrib?

    是否可以使用 NAnt 管理 IIS Web 应用程序 例如停止或启动它 Nant 具有 servicecontroller 任务 您可以使用它仅停止 启动 Web 服务器或整个 IIS 我通常使用它来停止 启动 Web 服务器
  • 如何在 php 中正确为我的 tbl_item 制作下拉列表菜单

    我的下拉列表菜单遇到问题 它不断出现 wamp 错误 我的下拉列表菜单将来自 tbl 项目的项目名称 postgres DB funcContainer php 页面 function DropdownListMenu label name
  • 扩展 MIDL 接口和 COM 对象设计

    我读过有关各种 COM 设计模式的详细信息COM 程序员的食谱 http msdn microsoft com en us library ms809982 aspx以及一些相关的 SO 线程 特别是讨论组合与多重继承的线程 https s
  • 我的插件未正确更新(upgrader_process_complete 问题)

    我有安装了我的插件的用户 我们将其称为 v6 我的插件的 V6 版本没有注册处理程序upgrader process complete 在我的新版本中 我有upgrader process complete注册对我的数据库表进行一些升级 然
  • 为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用?

    Java 8 为我们提供了许多有趣的方法来使用函数式接口以及新的注释 功能接口 http docs oracle com javase 8 docs api java lang FunctionalInterface html 它的工作是告
  • 使用 Postgres 将邻接列表转为 JSON 图

    我有以下标签表架构 CREATE TABLE tags id integer NOT NULL name character varying 255 NOT NULL parent id integer 我需要构建一个查询来返回以下结构 为
  • 获取 CFNetwork SSLHandshake 失败 (-9806) 错误

    我正在尝试使用调用我的网址 NSDictionary landingDetails appDelegate landingPage NSString devinf UIDevice currentDevice systemVersion N
  • Cassandra CQL3 导入 CSV

    背景 我创建了一个名为AvailableDomains 的架构 简单策略 1 个节点 在该键空间中 我创建了 1 个表 列族 称为包含列 id urn 时间戳 标志 的域 除时间戳之外的所有类型文本都是时间戳类型 我启动cassandra
  • 视频元素上出现不需要的边框[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何用webpack+react渲染图像?

    我对 React 和 Webpack 还很陌生 我遇到了这个我不明白的奇怪问题 问题 当我检查图像时 上面是我看到的 显然没有显示我的图像 我正在使用文件加载器 我的结构 网页包 const path require path const
  • R 中 KerasR LSTM 的数组转换

    为了在 KerasR 中使用 LSTM 我必须转换我的 NumericMatrix 335 x 1515 我想我在这里找到了解决方案https stats stackexchange com questions 274478 underst
  • rgl.snapshot() 不再有效

    我刚刚将 R 和 rgl 升级到以下版本 现在 rgl snapshot 不再起作用 它在以前的版本中有效 有没有解决的办法 R版本2 12 1 2010 12 16 rgl 版本 0 92 798 gt library rgl gt x
  • 从Dictionary中高效获取IReadOnlyDictionary

    public class Flea Animals var fleas new Dictionary