将一种类型的数组复制到不同类型的数组

时间:2017-07-27 07:40:40

标签: c#

我想知道是否可以在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);
    }
}

2 个答案:

答案 0 :(得分:7)

你可以用LINQ:

来做
fooArr = RawData.Select(r => (Foo)r).ToArray();

答案 1 :(得分:4)

由于某些原因,Array.CopyBuffer.BlockCopy都不愿意从int[]复制到Foo[],尽管Array.Copy可以进入其他方向非常愉快。

在我看来,您的选择是:

  • 您在原始帖子中显示的副本,尽管我将其写为:

    for (int i = 0; i < RawData.Length; i++)
    {
        fooArr[i] = RawData[i];
    }
    

    ..这样你就没有在循环范围之外的冗余变量

  • RomanoZumbé建议的基于LINQ的方法,虽然在这种情况下你不应该事先创建数组
  • 使用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循环或通过常规索引访问使用它,那就没问题了。