【问题标题】:C#, collection that holds Lists of different typeC#,包含不同类型列表的集合
【发布时间】:2011-11-21 22:41:56
【问题描述】:

我目前有一个包含 3 个字典的类,每个字典都包含每个字典中相同类型的列表,但字典中的类型不同,例如:

Dictionary1<string, List<int>> ... Dictionary2<string, List<double>>... Dictionary3<string, List<DateTime>>...

有没有办法使用可以保存所有列表的不同集合,以便我可以遍历列表集合?能够迭代是这种集合的唯一要求,不需要排序,不需要其他操作。

我希望能够通过字符串或其他标识符直接访问 List 并访问 List 的成员。类型安全不是必需的,但作为交换,我不想强​​制转换任何东西,速度绝对是这里的重中之重。

因此,当对列表的成员执行计算时,假定知道确切类型,例如“double lastValue = MasterCollection["List1"].Last();”,而假定 List1 是键入双。

这可以实现吗?抱歉,我有时可能会使用不正确或不完整的术语。我不是受过训练的程序员或开发人员。

谢谢, 马特

【问题讨论】:

  • 鉴于每个字典都包含不同类型的列表,我会假设每个字典都用于不同的目的。在这种情况下,拥有三个适当命名的字典似乎比拥有一个单一的、非类型安全的存储位置更清晰。您希望只有一本字典有什么特别的原因吗?
  • 唯一的原因是我喜欢作为整个项目的一部分,将所有列表的内容转储到数据表和/或后续数据库表中。在我目前的情况下,代码非常笨拙,因为我总是需要显式地遍历几个字典。

标签: c# list collections dictionary hashtable


【解决方案1】:

不,您尝试做的事情是不可能的;也就是说,对所有列表进行强类型而不强制转换的要求是阻止其余列表的原因。

如果您唯一的要求是遍历列表中的每个项目,那么您可以将您的字典创建为Dictionary<string, IEnumerable>(注意非通用接口)。 IEnumerable<T> 派生自 IEnumerable,这将允许您遍历列表中的每个项目。

这样做的问题是,您必须在某个时候对IEnumerable<T> 执行强制转换(假设您知道您正在使用它)或在Enumerable class 上使用Cast<T> extension method(后者是更糟糕的是,因为您可能会招致装箱/拆箱,除非它进行类型嗅探,在这种情况下,您不会受到性能损失)。

我会说您不应该将项目存储在一个列表中;您的示例用法表明您提前知道类型(您分配给双精度),因此您在那个时间点知道特定类型的列表。

不值得失去类型安全。

【讨论】:

  • 感谢您的解释,我想我认为我可以将列表(如不同的对象)存储在诸如哈希表或哈希列表之类的东西中,并且每当检索到列表时,列表的类型都是已知的.我想我猜错了……
【解决方案2】:

为此,您必须使用非通用 API,例如 IList(不是 IList<T>) - 即 Dictionary<string, IList>。或者因为你只需要迭代,也许只是IEnumerable(不是IEnumerable<T>)。然而!这意味着您说的是非泛型,因此可能需要做出一些牺牲(在检索期间对值类型进行装箱等)。

使用IList/IEnumerable 方法来调整您的示例:

double lastValue = MasterCollection["List1"].Cast<double>().Last();

当然,您可以在 IDictionary&lt;string,IList&gt; 上编写一些自定义扩展方法,允许类似:

double lastValue = MasterCollection.Get<double>("List1").Last();

不过,我不确定这是否值得。

【讨论】:

  • 其中一个要求是没有强制转换。这里的首要任务是速度,因此我不想强制转换。
  • @Matt 您的要求有冲突 - 必须做点什么。一个Dictionary&lt;TKey,TValue&gt; 只有一个TValue
猜你喜欢
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多