我目前有一个包含3个词典的类,每个词典包含每个词典中相同类型的列表,但字典中的类型不同,例如:
Dictionary1<string, List<int>> ...
Dictionary2<string, List<double>>...
Dictionary3<string, List<DateTime>>...
有没有办法使用可以容纳所有列表的不同集合,以便我可以遍历列表集合?能够迭代是这种收集的唯一要求,没有排序,不需要其他操作。
我希望能够通过字符串或其他标识符直接访问List并访问List的成员。类型安全不是必需的,但作为交换,我不想要施展任何东西,速度是绝对的首要任务。
因此,当对列表的成员执行计算时,假定确切类型的知识,例如“double lastValue = MasterCollection [”List1“]。Last();”,而假设List1是List of List双打。
这可以实现吗?很抱歉,我可能会使用有时不正确或不完整的术语我不是一个训练有素的程序员或开发人员。
谢谢, 马特
答案 0 :(得分:3)
为此,您必须使用非通用API,例如IList
(不是IList<T>
) - 即Dictionary<string, IList>
。或者因为你只需要迭代,可能只是IEnumerable
(不是IEnumerable<T>
)。然而!这意味着你说的是非泛型的,所以可能需要一些牺牲(在检索过程中装箱值类型等)。
使用IList
/ IEnumerable
appraoch来调整您的示例:
double lastValue = MasterCollection["List1"].Cast<double>().Last();
当然,您可以在IDictionary<string,IList>
上编写一些自定义扩展方法,允许更类似的内容:
double lastValue = MasterCollection.Get<double>("List1").Last();
但是,我不确定它是否值得。
答案 1 :(得分:0)
不,你想做什么是不可能的;也就是说,在没有强制转换的情况下对所有列表进行强类型操作的要求就是阻止其余列表。
如果您的唯一要求是遍历列表中的每个项目,那么您可以将字典创建为Dictionary<string, IEnumerable>
(请注意非通用接口)。 IEnumerable<T>
派生自IEnumerable
,允许您遍历列表中的每个项目。
这个问题是你必须在某个时刻对IEnumerable<T>
进行演员表(假设你知道你正在使用它)或者使用Cast<T>
extension method Enumerable
class (后者更糟糕,因为你可能会招致拳击/拆箱,除非它进行类型嗅探,在这种情况下,你不会有性能损失。)
我会说你不应该将这些项目存储在一个列表中;您的示例用法表明您提前知道了类型(您指定为double),因此您可以了解特定类型列表的时间点。
不值得失去类型安全。