我有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。有什么帮助吗?
最佳答案
遗憾的是,您必须迭代并转换...
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
内。 s。因此,出于这个原因,很清楚为什么你不能做你想做的事:-)
现在...如果您只需要使用每个元素一次,这不会减慢任何速度,也不会占用任何内存:
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);
关于c# - 将 Collection<dynamic> 转换为 Collection<double> 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29122334/