c#中,保存不同类型列表的集合

本文关键字:列表 集合 同类型 保存 | 更新日期: 2023-09-27 18:09:08

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

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

是否有一种方法可以使用不同的集合,可以保存所有的列表,以便我可以通过列表的集合进行迭代?能够迭代是这种集合的唯一要求,不需要排序,也不需要其他操作。

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

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

这能做到吗?对不起,我可能使用有时不正确或不完整的术语,我不是一个训练有素的程序员或开发人员。

谢谢,马特

c#中,保存不同类型列表的集合

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

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

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

当然,您可以在IDictionary<string,IList>上编写一些自定义扩展方法,允许类似以下内容:

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

我不确定是否值得。

不,你想做的是不可能的;也就是说,对所有列表进行强类型而不进行强制转换的要求阻碍了其他列表的实现。

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

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

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