日期:2014-05-20 浏览次数:20768 次
string[] textSegs = { "apple", "mango", "orange", "passionfruit", "grape" }; StringBuilder sb = new StringBuilder(); foreach(var txt in textSegs){ sb.Append(txt); } sb.ToString();
------解决方案--------------------
当然其实并不完全等价,因为第二个参数是有返回值的,也就是返回聚合后的值。返回值的类型要和传入的值相同,其他并没有限制。我改写代码中并没有体现出来。
第二个参数的签名如下:
Func<TAccumulate, TSource, TAccumulate> func
------解决方案--------------------
理解这个很容易,首先要看的是Aggregate函数的定义
public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
首先这是一个扩展方法(Extension Method),所有IEnumerable<T>类型的对象都可以使用这个方法。
第二个参数TAccumulate seed对应的是new StringBuilder()
第三个参数Func<TAccumulate, TSource, TAccumulate> func,func接受连个参数(TAccumnulate,TSource),TAccumnulate就是上面的seed,TSource指IEnumerable<TSource>中的TSource,这里也就是string(IEnumerable<string>). 最后TAccumulate指返回值类型
第四个参数Func<TAccumulate, TResult> resultSelector, TAccumulate还是上面那个seed,TResut是指string
简单来说:
new StringBuilder() --> TAccumulate
(sb, i) => sb.Append(i) --> (sb, i, sp) => return sb.append(i)
sp => sp.ToString() --> (sp, string) => return sp.ToString()