我有dynamic
类型的集合,我将其与int
,float
和double
一起提供。现在我需要将此Collection转换为Collection。
Collection<dynamic> values = new Collection<dynamic>();
values.Add((double)1);
values.Add((double)1.654654);
values.Add((double)10000.654654);
// How?
Collection<double> doubleValues = (Collection<double>)values;
我希望避免遍历整个集合,因为它的数量可能大于5000000.任何帮助?
答案 0 :(得分:1)
可悲的是,你必须进行迭代和演员......
double[] values2 = new double[values.Count];
for (int i = 0; i < values.Count; i++)
{
values2[i] = values[i];
}
或者最好在添加到Collection<>
请注意,Collection<dynamic>
非常像Collection<object>
(如果您typeof(Collection<dynamic>) == typeof(Collection<object>)
获得true
)。 dynamic
是编译器的一个技巧。这意味着您的号码已在object
内“加框”。因此,很明显为什么你不能做你想做的事:-)
现在......如果你只需要使用每个元素一次,这不会减慢任何速度,也不会占用任何内存:
public class MyDoubleList : IList<double>
{
public readonly Collection<dynamic> Base;
public MyDoubleList(Collection<dynamic> @base)
{
Base = @base;
}
// Now reimplement all the IList<double> methods by using the
// Base collection, like:
public int IndexOf(double item)
{
return Base.IndexOf(item);
}
public double this[int index]
{
get
{
return Base[index];
}
set
{
Base[index] = value;
}
}
public void Add(double item)
{
Base.Add(item);
}
// And so on
}
它是Collection<dynamic>
和IList<double>
之间的“按需”投射的适配器(如模式名称中所示)。注意问题:
// the same conversion has been done twice, slow :-)
double v1 = adaptor[0];
double v2 = adaptor[0];
然后
// 1 is added as a double, and then boxed in the Collection<dynamic>
// slow :-)
adaptor.Add(1);
答案 1 :(得分:1)
由于您要将所有值转换为double
类型,因此您可以执行此操作以获取值:
var myDoubles = collection.OfType<double>();
或者甚至更好,如果您知道自己要在集合中添加双打,只需将原始集合类型设为double
而不是dynamic
。