批量转换List中的对象

 

List是个泛型类,它提供的ConvertAll方法可以迅速的生成另外一个包含不同类型元素的List对象。这个方法的原型是: public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter); T就是这个List中元素的类型。Converter类是一个delegate类型的类,其原型为public delegate TOutput Converter<TInput, TOutput>(TInput input);    我们常常见到这种循环

 

List<SomeType> a = new List();

//Init List

 

foreach(SomeType s in a)

{

    //Do your business here
}

 

...
其中的For循环是没有必要的,因为List已经为我们提供了这种批量转换的方式,结合匿名代理,就更简单,.Net 3.0的Lambda表达式可以让整个转换更简单,我们以int转string来举例, 转换规则用一个方法定义(单个对象转换的方法),然后用作ConvertAll()的参数即可。

比如如下代码段转换int到string:

public string ConvertIntToString(int x)
       {
           return x.ToString();
       }
//...
List<int> a = new List<int>();
//Add elements to a
List<string> b = a.ConvertAll<string>(ConvertIntToString);

如果不考虑复用性,而转换规则又比较简单,匿名代理会更简洁:

List<int> a = new List<int>();
//Add elements to a
List<string> b = a.ConvertAll<string>(delegate(int x) { return x.ToString(); });

这里的匿名代理用Lambda表达式会更简洁易读些:

List<string> b = a.ConvertAll<string>((x)=>x.ToString());

附上最简代码,仅供参考 (C#3.0编译器会自动为我们推断类型):

var b = a.ConvertAll(x=>x.ToString());

这种方式比起前面的迭代取元素的方法要简单多了, 当然可以猜想这个ConvertAll的实现代码应该就是做的那个for循环:

public class List<T>
   {
       private T[] elements;
       //...
       public void Add(T e) 
       {
           //...
       }
       public List<TOut> ConvertAll<TOut>(Converter<T, TOut> converter)
       {
           List<TOut> outElementArr = new List<TOut>();
           foreach (T element in elements)
           {
               outElementArr.Add(converter(element));
           }
           return outElementArr;
       }
   }

思路放远一些,这个方法还能帮我们做更多的事情,它提供了一种创建对象的能力,使我们能从一组对象中创建另一组对象,这可就不是字面Convert所能包含的了,比如我们想求一个数组中每个数的平方...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值