【问题标题】:How do I create a dictionary type that holds different types in C#?如何在 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#。语法可能是我现在的主要限制:)
  • 我同意。我会改进这个问题。

标签: c# dictionary functional-programming


【解决方案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");

【讨论】:

  • 这确实会影响性能,但只要您在某些时候没有弹出空结构,它就会按预期工作。
猜你喜欢
  • 2011-05-05
  • 2011-03-06
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2020-01-01
  • 2020-12-11
相关资源
最近更新 更多