日期:2014-05-20  浏览次数:20735 次

Lambda表达式求解!!!!
IEnumerable<string> textSegs =
  from seg in root.Descendants("t")
  select (string)seg;

   
  string str = textSegs.Aggregate(new StringBuilder(),
  (sb, i) => sb.Append(i),
  sp => sp.ToString()
  );
请问 (new StringBuilder(),
  (sb, i) => sb.Append(i),
  sp => sp.ToString()
  );
这是什么意思呢?还有 (sb, i) => sb.Append(i),
  sp => sp.ToString()
这两句一起使用返回的是什么啊?

------解决方案--------------------
推倒。
其实可以解释为
 A a=new A()
 a。id=参数
------解决方案--------------------
聚合函数而已,相当于用foreach

(new StringBuilder(),
(sb, i) => sb.Append(i),
sp => sp.ToString()
);

其实应该写成下面这样更容易理解:
(new StringBuilder(),
(sb, next) => sb.Append(i),
sp => sp.ToString()
);
第一个参数是对集合中每个元素都要调用的聚合函数,会传入到第二个参数的回调方法中。

当然说的话就比较抽象了,改写一下你就懂了:

C# code

            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()