在 C# 中使用 LINQ 反转字典

2024-06-19

如何转换

Dictioanry<String,List<String>> into Dictionary<String,String>

我有一本像这样的字典

Dictioanry<String,List<String>>dictOne=new Dictionary<String,List<String>>();

并且其中包含

Key(String)          Value(List<String>)

     A                a1,a2
     B                b1,b2
     C                c1

我需要将“dictOne”转换为

 Dictionary<String,String> dictReverse=new Dictionary<String,String>()

所以结果会像

Key(String)         Value(String)

   a1                  A
   a2                  A
   b1                   B
   b2                  B
   c1                   C

有没有办法使用 LINQ 来做到这一点

提前致谢


Update:正如其他人所指出的,为了使字典真正以这种方式“可逆”,values在你的List<string>对象必须都是唯一的;否则,您无法创建Dictionary<string, string>源字典中的每个值都有一个条目,因为会有重复的键。

Example:

var dictOne = new Dictionary<string, List<string>>
{
    { "A", new List<string> { "a1", "a2" } },
    { "B", new List<string> { "b1", "b2" } },
    { "C", new List<string> { "c1", "a2" } } // duplicate!
};

您(至少)有两种选择来处理这个问题。

选项 1:添加重复项

您可能希望确保每个中的每个元素List<string>事实上,它是独一无二的。在这种情况下,一个简单的SelectMany with a ToDictionary会完成你所需要的;这ToDictionary调用会抛出一个ArgumentException遇到重复值时:

var dictTwo = dictOne
    .SelectMany(kvp => kvp.Value.Select(s => new { Key = s, Value = kvp.Key }))
    .ToDictionary(x => x.Key, x => x.Value);

将此功能抽象为自己的方法的最通用方法(想到的)是实现一个扩展方法,该方法可以为任何IDictionary<T, TEnumerable>实施地点TEnumerable实施IEnumerable<TValue>:

// Code uglified to fit within horizonal scroll area
public static Dictionary<T2, T1> ReverseDictionary<T1, T2, TEnumerable>(
    this IDictionary<T1, TEnumerable> source) where TEnumerable : IEnumerable<T2>
{
    return source
        .SelectMany(e => e.Value.Select(s => new { Key = s, Value = e.Key }))
        .ToDictionary(x => x.Key, x => x.Value);
}

上述方法中泛型类型参数的丑陋扩散是为了允许除严格类型之外的类型Dictionary<T, List<T>>: 它可以接受Dictionary<int, string[]>,例如,或者SortedList<string, Queue<DateTime>>——只是几个任意的例子来证明它的灵活性。

(说明此方法的测试程序位于本答案的底部。)

选项 2:跳过重复项

如果你的元素中有重复的元素List<string>value 是一个现实场景,您希望能够在不引发异常的情况下处理它,我建议您看一下加布的出色回答 https://stackoverflow.com/questions/3697973/reversing-dictionary-using-linq-in-c/3698175#3698175对于使用的方法GroupBy(实际上,Gabe 还提供了一种灵活的方法,可以基于选择器函数涵盖这两种情况中的任何一种;但是,如果您确实想要复制一个,我仍然建议上述方法,因为它应该比使用便宜一些GroupBy).

示例程序

这是一个小测试程序来说明Option 1上面关于一个Dictionary<string, List<string>> with 没有重复元素 in its List<string> values:

var dictOne = new Dictionary<string, List<string>>
{
    { "A", new List<string> { "a1", "a2" } },
    { "B", new List<string> { "b1", "b2" } },
    { "C", new List<string> { "c1" } }
};

// Using ReverseDictionary implementation described above:
var dictTwo = dictOne.ReverseDictionary<string, string, List<string>>();

foreach (var entry in dictTwo)
{
    Console.WriteLine("{0}: {1}", entry.Key, entry.Value);
}

Output:



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

在 C# 中使用 LINQ 反转字典 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 如何在 Google App Engine 上部署 1 个实例

    我需要在 Google App Engine 上部署一个简单 Node js 应用程序的 1 个实例 无需任何形式的扩展 我试过做gcloud preview app deploy 但是即使在我尝试关闭它们之后 也会创建许多实例 我的目标是
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 将 UNNEST 与 jOOQ 结合使用

    我正在使用 PostgreSQL 9 4 Spring Boot 1 3 2 和 jOOQ 3 7 我想 jOOQify 以下查询 SELECT id FROM users WHERE username IN SELECT FROM UNN
  • 设备旋转时的 SwiftUI 重绘视图组件

    如何在 SwiftUI 中检测设备旋转并重新绘制视图组件 当第一个出现时 我有一个 State 变量初始化为 UIScreen main bounds width 的值 但当设备方向改变时 该值不会改变 当用户更改设备方向时 我需要重新绘制
  • 参数编号无效:参数未在[重复]中定义

    这个问题在这里已经有答案了 被困在这里有一段时间了 当我尝试运行代码时收到此错误 警告 PDOStatement execute SQLSTATE HY093 无效参数 number 参数未定义于 Applications XAMPP xa
  • 检查图像文件是否存在,Robot-Framework,Selenium2Library

    我想知道是否可能以及如何检查应该显示图片的元素是否确实显示了图片 图片位于 img src 并且在同一域内 目前尚不完全清楚您的目标是什么 我认为可以安全地假设 如果您的代码执行正确的所有操作 即 URL 正确 并且 css 规则不会导致元
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 C# WCF 扩展性代码移至配置文件

    以下代码将 ParameterInspector 添加到端点 ChannelFactory
  • 在 VB2010 Windows 窗体开始时播放 .wav/.mp3 文件?

    制作 VB2010 已经大约一年了 最近开始突破我可以将哪种媒体合并到我的表单中的界限 但我无法播放 wav 或 mp3 文件 我尝试按照微软和其他编码网站上的教程进行操作 但没有成功 任何帮助 将不胜感激 要播放波形文件 您可以简单地使用
  • PyOpenCL:如何创建本地内存缓冲区?

    这里可能是非常简单的问题 但我已经搜索了几个小时但没有任何结果 我有这段代码 我希望有一个 256 位 8 uint32 bitstring gpu 作为设备中的本地内存指针 def Get Bitstring GPU Buffer ctx
  • SQLAlchemy 中 mssql+pyodbc 出现“数据源名称太长”错误

    我正在尝试使用 SQLAlchemy 和 pyodbc 将数据帧上传到 Azure SQL Server 数据库上的数据库 我已建立连接 但上传时出现错误 pyodbc Error IM010 IM010 Microsoft ODBC 驱动
  • 使用 jQuery 获取 ASP.Net Gridview 的 rowIndex

    您好 是否可以使用 jQuery 获取 gridview 的当前行索引 一点背景 我使用模板字段中的服务器端链接按钮从 gridview 中删除行 如下所示
  • PHP 数组到 JavaScript 数组

    假设我在 php 中有这个数组 cities array Caracas gt array air gt array 4 3 5 Working Days Saturday sea gt array 18 3 5 Days Wednesda
  • -all_load 其他链接器标志导致第 3 方框架中的重复符号错误

    我有一个用于内部应用程序的静态库 其中包含一些常见的实用程序代码 从以前的 SO 帖子中 我发现为了在运行时加载静态库中的类别 我需要包括 all load ObjC在 构建设置 中的 其他链接器标志 字段中 但是 对于我也在使用的闭源第三
  • 为什么 Backbone.js 模型的“on()”将“this”作为最后一个参数(如果它几乎总是如此)?

    我刚刚接触 Backbone 我不明白的一件事是为什么模型的 on 方法总是采用三个参数 事件 处理程序和上下文 似乎几乎总是 this 用于上下文 我还没有看到任何其他用法 即使有 因为我还没有见过 那一定是相当罕见的 所以我的问题是 什
  • 隐藏/显示 DIV - 将当前效果更改为淡入淡出

    我目前正在使用网络教程中找到的以下代码来显示 隐藏 DIV 效果很好 但不喜欢这种效果 希望 DIV 淡入 淡出 或者更平滑的东西 目前 DIV 是从右上角增长的 我该如何调整代码来做到这一点 你可以在这里看到它http jsfiddle
  • 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

    我正在 iPhone 4 上使用前置摄像头拍摄视频 并将视频与其他一些媒体资源结合起来 我希望该视频为纵向 所有视频的默认方向都是横向 在某些情况下 您必须手动管理 我正在使用 AVFoundation 特别是 AVAssetExportS
  • yii2 无线电内联 Html 帮助器

    我在 yii2 中有这个 radioList Html radioList abc null new class gt form control input sm 它生成这个 div class radio 但我想要 div class r
  • 不将 ViewModel 放置在单独的程序集中有充分的理由吗?

    我正在 WPF 中使用 MVVM 模式开发一个项目 MVVM 的主要优势之一是保持业务逻辑和表示之间的清晰分离 为了测试所有内容实际上的分离程度 周末我将所有 ViewModel 模型和业务逻辑移动到一个单独的 dll 中 exe 被保留为
  • 在 C# 中使用 LINQ 反转字典

    如何转换 Dictioanry