我想知道是否可以在C#中使用某种Array.Copy方法将一个数组的元素复制到相同大小但不同类型的数组。
我从本机c ++库中获取一个结构,该库包含指向Integer和size元素的指针。这些整数值表示枚举Foo
的枚举值。
目前我正在使用for循环。有更好/更安全的方法吗?
谢谢!
使用Array.Copy
会抛出ArrayTypeMismatchException
,如下所示:
using System;
public class Program
{
public enum Foo
{
FOO_1,
FOO_2
}
public static void Main(string[] args)
{
int nCount = 1;
Foo[] fooArr = new Foo[nCount];
Int32[] RawData = new Int32[nCount];
RawData[0] = 100;
Array.Copy(RawData, fooArr, nCount);
}
}
答案 0 :(得分:7)
你可以用LINQ:
来做fooArr = RawData.Select(r => (Foo)r).ToArray();
答案 1 :(得分:4)
由于某些原因,Array.Copy
和Buffer.BlockCopy
都不愿意从int[]
复制到Foo[]
,尽管Array.Copy
可以进入其他方向非常愉快。
在我看来,您的选择是:
您在原始帖子中显示的副本,尽管我将其写为:
for (int i = 0; i < RawData.Length; i++)
{
fooArr[i] = RawData[i];
}
..这样你就没有在循环范围之外的冗余变量
使用Array.ConvertAll
的LINQ-like-not-LINQ方法:
var fooArr = Array.ConvertAll(RawData, x => (Foo) x);
...这比LINQ方法更有效,因为它可以创建一个正确大小的数组。
如果您不需要执行时类型实际为Foo[]
,您可以在没有任何复制的情况下进行投射......因为CLR很乐意对待int[]
作为Foo[]
:
Foo[] fooArr = (Foo[]) (object) RawData;
此时,您有一个数组对象,您可以将其视为int[]
(通过RawData
)或Foo[]
(通过fooArr
) 。通过任一变量的更改将在另一个变量中可见。这显然非常有效,但可能会导致其他地方出现问题,具体取决于您使用fooArr
的方式。如果您只是在foreach
循环或通过常规索引访问使用它,那就没问题了。