c# - 将 Collection<dynamic> 转换为 Collection<double> 的最佳方法?

标签 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。有什么帮助吗?

最佳答案

遗憾的是,您必须迭代并转换...

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/

相关文章:

c# - C# 有办法给我一个不可变的字典吗?

c# - 如何调试 soap web 服务?

c# - Azure、SQL 事务和连接

c# - 更改后如何获取自动实现属性 C# 6.0 的默认编译时值?

C# - 在未完成时显示加载?

c# - 使用 List<T> 参数构造 HashSet<T> 时是否允许重复?

c# - C#函数中的可选参数

c# - 获取用户参与的特定项目

c# - 更改 launchSettings.json 中的端口会导致到达 "This site can’”

java - 如何将 Set<Set> 转换为 ArrayList<ArrayList>