【问题标题】:c# How can I define a dictionary that holds different types?c#如何定义一个包含不同类型的字典?
【发布时间】:2011-03-06 09:33:43
【问题描述】:

如果有以下代码。在你看到 XXX 的地方,我想放入一个 long[] 类型的数组。

我该怎么做?如何从字典中获取值?我是否只使用 defaultAmbience["CountryId"][0] 来获取第一个元素?

public static Dictionary<string, object> defaultAmbience = new Dictionary<string, object>
{
    { "UserId", "99999" },
    { "CountryId", XXX },
    { "NameDefaultText", "nametext" },
    { "NameCulture", "it-IT" },
    { "NameText", "namelangtext" },
    { "DescriptionDefaultText", "desctext" },
    { "DescriptionCulture", "it-IT" },
    { "DescriptionText", "desclangtext" },
    { "CheckInUsed", "" }
};

【问题讨论】:

  • 你的代码试过了吗?
  • 也许你应该使用类或结构。
  • 您是在处理 ldap 还是 ldif 数据?

标签: c# dictionary types


【解决方案1】:

首发:

如果您不知道值或键的类型,请不要使用通用字典。

.NET 泛型最适合您提前知道类型的情况。 .NET 还提供了一整套集合,供您存储不同类型对象的“混合包”时使用。

在这种情况下,字典的等效项是HashTable

查看System.Collections(而不是 System.Collections.Generic)命名空间以查看您拥有的其余选项。

如果您知道密钥的类型,那么您所做的就是正确的方法。

其次:

当您检索该值时...您将需要将对象转换回其原始类型:

long[] countryIds = (long[]) defaultAmbience["CountryId"];

// To get the first value
long id = ((long[])defaultAmbience["CountryId"])[0];

【讨论】:

  • 使用非泛型类型在这里并没有真正的帮助——他仍然需要进行强制转换等。而且他确实知道键将是字符串,所以他实际上从中获得了一些好处使用通用版本。
  • Dictionary&lt;string, object&gt; 有什么问题?对我来说,这更清楚地表明了存储混合项目的意图。此外,它会阻止您尝试使用非字符串键(另请参阅stackoverflow.com/questions/1433713/…
  • @0xA3 - 什么都没有。我更新了我的答案。只要他知道钥匙的类型,他现在做的就很好。
  • 感谢您的长时间帮助!我提前知道类型、键和值,所以字典应该很适合我。感谢大家的快速回答,非常感谢!干杯
【解决方案2】:

你需要提供你调用它的演员。

((long[])defaultAmbience["countryID"])[0];

【讨论】:

    【解决方案3】:

    在这种情况下,C# 并不真正知道您希望获得什么类型,因此您必须在从字典中获取它之后和使用它之前将其转换为正确的类型。如果是这个长数组,这将是:

    ((long[])defaultAmbience["CountryId"])[0]
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2011-05-05
      • 1970-01-01
      • 2012-12-23
      • 2011-08-17
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多