数组之间如何进行转换

分析问题

  在程序中,类型转换无处不在,数组类型也不例外。对于普通的类型,子类对象可以隐式地转换为父类类型,所有的数组类型都继承自System.Array类型,不存在相互间的关系,但隐式转换仍然被允许,其机制如下:

  1、包含值类型项目的数组不能隐式地转换成其他任何类型。

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

  在满足上述两个前提下,源数组的项目类型必须存在一个隐式或者显式的转换到目标数组的项目类型。

  下面的一些代码说明了转换的机制:

  //编译成功

  string[] sz={"a","a","a"};

  object[] oz=sz;

  //编译失败,值类型项目的数组不能被转换

  int[] sz={1,2,3};

  object[] oz=sz;

  //编译失败,两者维数不同

  string[,] sz={{"a","b"},{"a","b"}};

  object[] oz=sz;

注意

  隐式转换数组类型并不是一个好方法,当一个object[]的引用指向一个数组是,任何对数组项目的合法操作都会产生性能影响,而任何类型不符合的操作都会在运行时抛出一个ArrayTypeMismatchException异常。

  除了类型上的转换,有时候程序员还会遇到内容转换的需求。举例来说,在一系列的用户界面操作后,系统的后台可能得到一个DateTime的数组,而现在的任务是把它们存储到数据库中,而数据访问层提供的接口直接受string[]的参数,这时候程序员要做的就是把DateTime[]从内容上转换为string[]对象。当然,惯例的做法是遍历整个源数组,逐一地转换每个对象并且将其放入一个目标数组项目类型的容器之中,最后再生成目标数组,这样的做法在程序的灵活性和性能上都比不上Array.ConvertAll方法。后者提供了一个简便的转换数组间内容的接口,程序员需要指定源数组的项目类型、对象数组的项目类型和转换的算法,该方法就能高效地完成转换的工作。以下代码展示了具体的使用方法。

using System;
using System.Collections.Generic;

namespace Test
{
    class ArrayConvert
    {
        static void Main()
        {
            string[] times = { "2008-1-1", "2008-1-2", "2008-1-3" };
            //使用不同的方法转换
            DateTime[] result1 = OneByOne(times);
            DateTime[] result2 = ConvertAll(times);
            //结果是相同的
            foreach (var item in result1)
            {
                Console.WriteLine(item.ToString("yyyy-MM-dd"));
            }
            Console.Write("\r\n");
            foreach (var item in result2)
            {
                Console.WriteLine(item.ToString("yyyy-MM-dd"));
            }
            Console.Read();
        }

        //逐个手动转换
        private static DateTime[] OneByOne(string[] times)
        {
            List<DateTime> result = new List<DateTime>();
            foreach (var item in times)
            {
                result.Add(DateTime.Parse(item));
            }
            return result.ToArray();
        }
        //使用Array.ConvertAll方法
        private static DateTime[] ConvertAll(string[] times)
        {
            return Array.ConvertAll(times, new Converter<string, DateTime>(ArrayConvert.DateTimeToString));
        }

        //转换算法
        private static DateTime DateTimeToString(string time)
        {
            return DateTime.Parse(time);
        }

    }
}

  以上代码展示了两种内容转换的区别,两者实现了相同的功能,但Array.ConvertAll不需要程序手动遍历数组,也不需要生成一个临时的容器对象,更加突出的优势是,它可以接受一个动态的算法作为转换依据。这个算法可以以一个方法的形式传入,也可以以一个委托的形式传入,关于委托的概念在后面章节中会有叙述。这样的机制保证了Array.ConvertAll拥有了相当高的程序灵活性和运行性能。

答案

  数组类型在符合条件的情况下可以进行隐式的转换,条件包括:数组维数必须相同;目标项目类型和源项目类型必须存在隐式或者显式转换关系;源数组的项目类型不是值类型。

  数组类型可以通过Array.ConvertAll方法进行内容转换,该方法需要使用者提供一个转换算法,以委托或者方法的形式传入Array.ConvertAll方法中。

数组之间如何进行转换

时间: 2024-10-22 08:00:11

数组之间如何进行转换的相关文章

List Set与数组之间的互相转换

---------------转载 数组和List.Set都可以存放多个元素,数组的特点是长度固定,访问速度非常快,元素类型单一:List的特点是长度可以动态增加,能够维护元素的次序,存入的所有元素都当做Object,允许元素重复:Set的特点是长度可以动态增加,能够保证元素不重复,存入的所有元素都当做Object.本节实例介绍Set.List和数组之间如何转换,将Set.List对象中的元素转换为数组,将数组转换为Set.List对象,转换过程中元素保持不变. 关键技术剖析: 实现List.S

一个简单的XML与数组之间的转换

xml是网络使用最多的数据交换格式,所以,不掌握怎么操作它,又有蛋疼的了. php中可以操作xml的类/函数很多,个人认为最简单的是SimpleXMLElement这个类,它的使用就跟其名字一样:简单.当然要想全面自如的操作xml,还得借助其他的类.SimpleXMLElement主要是对xml的进行节点的添加和获取,以及输出整个xml文本内容,但是对于实现一个简单的与数组之间的内容转换,已经足够了. 比如我们现在在接一个sdk,对方接口传过来的是一个简单的xml格式数据,我们需要取到它,并作一

JAVA中list,set,数组之间的转换详解

JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.collections.CollectionUtils; String[] strArray = {"aaa", "bbb", "ccc"};    List strList = new ArrayList();    Set strSet = new Ha

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

c#不同数组之间的转换【转载,消化自动删除】

c#中从string数组转换到int数组 string[] input = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };int[] output = Array.ConvertAll<string, int>(input, delegate(string s) {

C# 16进制与字符串、字节数组之间的转换(转)

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+C

字符串和字符数组之间的转换

package String; /* * 写了一个字符串和字符数组之间转换的例子 * 总结:将字符串转变为字符数组 :public char[] toCharArray() * 直接将一个字符数组变成一个字符串 public String (char[] value) 这个是构造函数啊,可以直接new 并为属性赋值啊. */ public class StringDemo2 { public static void main(String[] args) { String s = "hellow

Java 集合与数组之间的转换

Java 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 (T...a)是可变参数,看成(T[] a)即可 <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表,这是披着List外表的纯数组,只是原数组的一个视图(对返回列表的更改会“直接写”到数组.) 返回的列表是可序列化的,并且实现了 RandomAcce

Delphi字符串、PChar与字符数组之间的转换

来自:http://my.oschina.net/kavensu/blog/193719 ----------------------------------------------------------------- var s: string; p: pchar; a: array[1..20] of char; 1.字符串 ---> PChar p := PChar(s); 2.PChar ---> 字符串 s := p; 3.PChar ---> 字符数组 StrCopy(@a