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<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,该方法能将一种类型的数组转换为另一种类型的数组。该方法能有效的解决上述问题的痛点。

我们来看一下这个方法是怎样定义的:

`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方法仅用两行代码,与前述的解决方法相比,结果一目了然、不言而喻。

原文链接:https://www.cnblogs.com/iZOHC/p/16199945.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值