一、场景假设

假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开。要求用此字符串中的数字快速生成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<T>(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,该方法能将一种类型的数组转换为另一种类型的数组。该方法能有效的解决上述痛点问题。

1、首先我们来看一下这个方法的定义:

public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter)

  • 该方法没有重载方法,是类的静态方法,无需创建实例去调用。
  • TInput:源数组元素的类型。
  • TOutput:目标数组元素的类型。

上述问题用ConvertAll方法该如何编码呢?下面给出代码示例:

var arr = str.Split(',');
var numArr = Array.ConvertAll<string, int>(arr, z => int.Parse(z));

或者

var arr = str.Split(',');
var numArr = Array.ConvertAll<string, int>(arr, delegate (string s) { return int.Parse(s); });

ConvertAll方法仅有两行代码,与前述的解决方法相比,结果一目了然、不言而喻。

五、刨根问底

那ConvertAll是如何实现数组数据类型转换的呢?我们反编译一下该方法,得到如下代码:

public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> 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<in TInput, out TOutput>(TInput input);

知其然知其所以然,以后再遇到数组转换的问题我们就不用在怕了。

这时,有的同学可能会说:“在不知道Converter方法和其实现的提前下,我也是可能写出与Converter方法相同的实现代码的”。那不得不说你真的很棒,既然系统底层提供了该方法供我们使用,我们再编码一遍(提前是不知道Converter方法存在和其实现代码)岂不是有点多余?直接使用何乐而不为呢?

本篇文章我们经历了:提出问题->解决问题->延伸问题->刨根问底

这样的思考方式有助于我们快速提升编码能力,也希望这样的思考方式能给你们解决问题带来些许灵感。

---------------the end---------------

----------本篇文章到此结束----------

最新文章

  1. MySQL外键之级联
  2. FileSaver.js ////////////////////zzzzzzzzzzzzzz
  3. 该怎样提高ZBrush的创作效率
  4. 20145236 《Java程序设计》 第6周学习总结
  5. Windows下为64位的python3.4.3安装numpy
  6. 关于mysql函数GROUP_CONCAT
  7. JAVA基础——编程练习(二)
  8. 安装Appium
  9. 转载---SuperMap GIS 9D SP1学习视频播单
  10. maven环境变量的配置及+eclipse的配置使用
  11. SpringBoot标准Properties
  12. omitting directory `folder/&#39;
  13. Android USB ADB ATUH 验证包验证流程
  14. 《JavaScript总结》js的运行机制
  15. Redis缓存用起来
  16. Python 解释器介绍
  17. python学习 day19 (3月26日)----(对象组合)
  18. B1029 旧键盘 (20 分)
  19. 【剑指offer】斐波那契数列
  20. vi如何修改注释颜色

热门文章

  1. SpringAOP--动态数据源
  2. 什么是线程组,为什么在 Java 中不推荐使用?
  3. Ls 命令执行什么功能? 可以带哪些参数,有什么区别?
  4. Zookeeper 下 Server 工作状态?
  5. 学习FastDfs(二)
  6. Python的数据基础库Numpy怎样对数组进行排序
  7. numpy计算数组中满足条件的个数
  8. React 和 ES6 工作流之 Webpack的使用(第六部分)
  9. React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)
  10. 使用 Vuex + Vue.js 构建单页应用【新篇】