C#怎么实现数组元素的数据类型转换
这篇文章主要介绍"C#怎么实现数组元素的数据类型转换"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"C#怎么实现数组元素的数据类型转换"文章能帮助大家解决问题。
一、场景假设
假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开。要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量。
string str = "1,2,3,4,5,6,7,8,9";
二、解决方案
我相信大多数同学在拿到这题的时候,一般都会给出以下的解决方案:
public int[] String2IntArray(string str){ var strArr = str.Split(','); int[] numArr = new int[strArr.Length]; for (int i = 0; i < strArr.Length; i++) { numArr[i] = Convert.ToInt32(strArr[i]); } return numArr;}
上述代码确实能解决上述场景中的问题。
三、问题延伸
可是这时要求变了,改为生成char类型的数组。
这时一部分同学会说,既然让生成char类型数组,那我改下数据类型不就可以了嘛,于是给出如下代码:
public char[] String2CharArray(string str){ var strArr = str.Split(','); char[] cArr = new char[strArr.Length]; for (int i = 0; i < strArr.Length; i++) { cArr[i] = Convert.ToChar(strArr[i]); } return cArr;}
另外一部分同学会说,每改一下输出的数据类型就要再写一个相应的方法,这样不通用不是很好。能不能用泛型解决此问题呢?想了一下,给出了以下代码:
public T[] String2Array(string str){ var tc = TypeDescriptor.GetConverter(typeof(T)); var strArr = str.Split(','); T[] tArr = new T[strArr.Length]; for (int i = 0; i < strArr.Length; i++) { tArr[i] = (T)tc.ConvertTo(strArr[i], typeof(T)); } return tArr;}
上面泛型代码解决方案可圈可点,可通用性感觉还是较差,代码量还是有点多。
如果这时要求数组对象实例直接进行转换呢?上面泛型代码解决方案又要进行优化改进。这时有没有更好的解决方案呢?答案是有的。
四、数组类的静态转换方法
数组(Array)类有一个静态方法ConvertAll,该方法能将一种类型的数组转换为另一种类型的数组。该方法能有效的解决上述问题的痛点。
我们来看一下这个方法是怎样定义的:
public static TOutput[] ConvertAll
该方法没有重载方法,是类的静态方法,无需创建实例便可直接通过类名调用。
TInput:源数组元素的类型。
TOutput:目标数组元素的类型。
上述问题用ConvertAll方法该如何编码实现呢?下面给出代码示例:
var arr = str.Split(',');var numArr = Array.ConvertAll(arr, z => int.Parse(z));
或者
var arr = str.Split(',');var numArr = Array.ConvertAll(arr, delegate (string s) { return int.Parse(s); });
ConvertAll方法仅用两行代码,与前述的解决方法相比,结果一目了然、不言而喻。
五、刨根问底
那ConvertAll是如何实现数组元素的数据类型转换的呢?我们反编译一下该方法,得到如下代码:
public static TOutput[] ConvertAll(TInput[] array, Converter converter){ if (array == null) { throw new ArgumentNullException("array"); } if (converter == null) { throw new ArgumentNullException("converter"); } TOutput[] array2 = new TOutput[array.Length]; for (int i = 0; i < array.Length; i++) { array2[i] = converter(array[i]); } return array2;}
我们再看一下Converter是如何定义的:
public delegate TOutput Converter
知其然知其所以然,以后再遇到数组转换的问题我们就不用再怕了。
这时,有的同学可能会说:"在不知道Converter方法和其实现的提前下,我也是可能写出与Converter方法相同的实现代码的"。那不得不说你真的很棒,既然系统底层提供了该方法供我们使用,我们再编码一遍(提前是不知道Converter方法存在和其实现代码)岂不是有点多余?直接使用何乐而不为呢?
关于"C#怎么实现数组元素的数据类型转换"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。