将Collection <dynamic>转换为Collection <double>的最佳方法是?</double> </dynamic>

时间:2015-03-18 12:40:00

标签: c# .net collections

我有dynamic类型的集合,我将其与intfloatdouble一起提供。现在我需要将此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.任何帮助?

2 个答案:

答案 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