繁体   English   中英

C# 投射整个阵列?

[英]C# Cast Entire Array?

我看到了这个Array.ConvertAll方法,但它需要一个Converter作为参数。 当我已经在我的 class 中定义了一个隐式转换器时,我不明白为什么我需要一个转换器:

    public static implicit operator Vec2(PointF p)
    {
        return new Vec2(p.X, p.Y);
    }

我正在尝试将PointF数组转换为Vec2数组。 有没有好的方法来做到这一点? 或者我应该接受它并编写(另一个)转换器或循环元素?

使用Cast /'Select' 建议的 LINQ 解决方案很好,但由于您知道您在这里使用的是数组,因此使用ConvertAll效率更高,而且同样简单。

var newArray = Array.ConvertAll(array, item => (NewType)item);

使用ConvertAll手段
a) 数组只迭代一次,
b) 该操作针对数组进行了更优化(不使用IEnumerator<T> )。

不要让Converter<TInput, TOutput>类型让您感到困惑——它只是一个简单的委托,因此您可以为它传递一个 lambda 表达式,如上所示。

作为对这个旧问题的更新,您现在可以执行以下操作:

myArray.Cast<Vec2>().ToArray();

其中 myArray 包含源对象,而 Vec2 是您要转换为的类型。

Cast 不考虑用户定义的隐式转换,因此您不能像这样转换数组。 您可以使用 select 代替:

myArray.Select(p => (Vec2)p).ToArray();

或者写一个转换器:

Array.ConvertAll(points, (p => (Vec2)p));

后者可能更有效,因为结果的大小是预先知道的。

最有效的方法是:

class A { };
class B : A { };

A[] a = new A[9];
B[] b = a as B[];

这是与@user366312 提出的赏金问题相关的答案,与原始问题无关。

.NET Framework 2.0 的解决方案是什么?

据我所知,LINQ 早在 2007 年就引入了 3.5 版的 .NET Framework。因此这意味着无法在 .NET Framework 2.0 中使用 LINQ。

因此,我将只使用常规的 for 循环并转换数组中的每个元素。

像这样的东西没有测试它:

var newArray = new NewType[myArray.Length];

for (var i = 0; i < myArray.Length; i++)
{
    newArray[i] = (NewType)myArray[i];
}

您可以将其包装在如下方法中:

public static NewType[] ConvertAll(Vec2[] myArray)
{
    var newArray = new NewType[myArray.Length];

    for (var i = 0; i < myArray.Length; i++)
    {
        newArray[i] = (NewType)myArray[i];
    }

    return newArray;
}

并使用它

var newArray = ConvertAll(myArray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM