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所能包含的了,比如我们想求一个数组中每个数的平方...