你知道C#数组之间如何转换的吗?

数组类型的转换需要遵循以下两个原则:

(1)包含值类型的数组不能被隐式转换成其他任何类型;

(2)两个数组类型能够相互转换的一个前提是两者维数相同;

我们可以通过以下代码来看看数组类型转换的机制:.

// 编译成功
string[] sz = { "a", "a", "a" };
object[] oz = sz;
// 编译失败,值类型的数组不能被转换
int[] sz2 = { 1, 2, 3 };
object[] oz2 = sz;
// 编译失败,两者维数不同
string[,] sz3 = { { "a", "b" }, { "a", "c" } };
object[] oz3 = sz3;

除了类型上的转换,我们平时还可能会遇到内容转换的需求。例如,在一系列的用户界面操作之后,系统的后台可能会得到一个DateTime的数组,而现在的任务则是将它们存储到数据库中,而数据库访问层提供的接口只接受String[]参数,这时我们要做的就是把DateTime[]从内容上转换为String[]对象。当然,惯常做法是遍历整个源数组,逐一地转换每个对象并且将其放入一个目标数组类型容器中,最后再生成目标数组。But,这里我们推荐使用Array.ConvertAll方法,它提供了一个简便的转换数组间内容的接口,我们只需指定源数组的类型、对象数组的类型和具体的转换算法,该方法就能高效地完成转换工作。

下面的代码清楚地展示了普通的数组内容转换方式和使用Array.ConvertAll的数组内容转换方式的区别:

public class Program
{
    public static void Main(string[] args)
    {
        String[] times ={"2008-1-1",
                        "2008-1-2",
                        "2008-1-3"};

        // 使用不同的方法转换
        DateTime[] result1 = OneByOne(times);
        DateTime[] result2 = ConvertAll(times);

        // 结果是相同的
        Console.WriteLine("手动逐个转换的方法:");
        foreach (DateTime item in result1)
        {
            Console.WriteLine(item.ToString("yyyy-MM-dd"));
        }
        Console.WriteLine("使用Array.Convert方法:");
        foreach (DateTime item2 in result2)
        {
            Console.WriteLine(item2.ToString("yyyy-MM-dd"));
        }

        Console.ReadKey();
    }

    // 逐个手动转换
    private static DateTime[] OneByOne(String[] times)
    {
        List<DateTime> result = new List<DateTime>();
        foreach (String item in times)
        {
            result.Add(DateTime.Parse(item));
        }
        return result.ToArray();
    }

    // 使用Array.ConertAll方法
    private static DateTime[] ConvertAll(String[] times)
    {
        return Array.ConvertAll(times,
            new Converter<String, DateTime>
            (DateTimeToString));
    }

    private static DateTime DateTimeToString(String time)
    {
        return DateTime.Parse(time);
    }
}

从上述代码可以看出,二者实现了相同的功能,但是Array.ConvertAll不需要我们手动地遍历数组,也不需要生成一个临时的容器对象,更突出的优势是它可以接受一个动态的算法作为具体的转换逻辑。当然,明眼人一看就知道,它是以一个委托的形式作为参数传入,这样的机制保证了Array.ConvertAll具有较高的灵活性。