如何在 C# 中创建包含不同类型的字典类型?

Posted

技术标签:

【中文标题】如何在 C# 中创建包含不同类型的字典类型?【英文标题】:How do I create a dictionary type that holds different types in C#? 【发布时间】:2020-12-06 18:09:26 【问题描述】:

我想为包含不同类型作为值的字典定义一个类型。事实上,我正在寻找 How do I create a Dictionary that holds different types in C#,但寻找的是 immutable dict 类型而不是字典“变量”。

假设我有一个代表用户数据的字典

using System.Collections.Immutable;

var immutableUserVariable = new Dictionary<string, object>
        
             "Id", 0 ,
             "FirstName", "Annett" ,
             "LastName", "Jones",
             "Active", true
        .ToImmutableDictionary();

类型隐式推断如下(.NET interactive 的输出):

|    key    |      type      |  value |
|:---------:|:--------------:|:------:|
| LastName  | System.String  | Jones  |
| Active    | System.Boolean | True   |
| FirstName | System.String  | Annett |
| Id        | System.Int32   | 0      |

我可以在如下的不可变列表中使用此用户

var immutableUserList = new[]  immutableUserVariable .ToImmutableList();
immutableUserList

但是,我不想创建字典变量immutableUserVariable,而是为这个自定义的、不可变的字典 (User) 创建一个类型,我可以用它来创建变量。这将允许我使用特定的 dict 类型创建列表,例如


var immutableListBuilder = ImmutableList.CreateBuilder<User>();
// add dicts of type User
immutableListBuilder.Add(...);
immutableListBuilder.Add(...);

【问题讨论】:

我什么都没有。 好的,您能否解释一下您的预期用途以及为什么需要它以及为什么您链接的链接没有帮助?您所说的“而不是 dict “变量”是什么意思? 我想为“用户”定义一个类型,为单个字段(Id -> int,FirstName -> string,LastName -> string,Active -> bool)指定类型一个不可变的字典(未排序)。我想用这种类型以函数的方式创建和重新创建不可变的字典。 如果有人知道函数式编程概念(不变性),那么我的目标应该很清楚。我已经很久没有使用 C#,也从未使用过函数式 C#。语法可能是我现在的主要限制:) 我同意。我会改进这个问题。 【参考方案1】:

你可以使用对象类型作为值

Dictionary<string, object> pairs = new Dictionary<string, object>();
        
pairs.Add("key1", 1);
pairs.Add("key2", "string");

int i = (int)pairs["key1"];

或者您可以创建自定义类:

public class MyDictionary : Dictionary<string, object>

    public T Get<T>(string key)
        => (T)this[key];


MyDictionary pairs = new MyDictionary();
pairs.Add("key1", 1);
pairs.Get<int>("key1");

【讨论】:

这确实会影响性能,但只要您在某些时候没有弹出空结构,它就会按预期工作。

以上是关于如何在 C# 中创建包含不同类型的字典类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在类型变量中创建任何类型的字典? [复制]

如何在java中的每个arraylist中创建具有不同类型对象的arraylist数组?

如何在c#中创建指针类型类的指针

如何在不同的表中创建 3 种类型的用户,但他们都有电子邮件、密码、用户名? [关闭]

如何在 Java 中创建字典? [关闭]

如何在 C# 中创建 COM 可见类?