批量转换List中的对象

来源:互联网 发布:java支付接口开发原理 编辑:程序博客网 时间:2024/04/29 12:32
 

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 aList<string> b = a.ConvertAll<string>(ConvertIntToString);

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

List<int> a = new List<int>();//Add elements to aList<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所能包含的了,比如我们想求一个数组中每个数的平方...

原创粉丝点击