专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » lambda表达式:C#3.0入门系列(十 2)-Lambda表达式中Lifting »正文

lambda表达式:C#3.0入门系列(十 2)-Lambda表达式中Lifting

来源: 发布时间:星期二, 2009年2月17日 浏览:59次 评论:0
  Lambda表达式是由匿名思路方法演化而来更加高级形式有关匿名思路方法请参阅http://msdn.microsoft.com/msdnmag/issues/04/05/C20/有关Lambda表达式演化请参阅http://msdn.microsoft.com/msdnmag/issues/07/06/csharp30/default.aspx?loc=zh英文原版为http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/

  1Lambda表达式中lting

  在c# 2.0中匿名思路方法使用是这样

SomeClass
{
  delegate void SomeDelegate;
  public void InvokeMethod
  {
   SomeDelegate del = delegate
             {
               MessageBox.Show("Hello");
             };
   del; 
  }
}


  在LINQ 演变及其对 C# 设计影响 文中其断言如果 lambda 表达式首先被引入语言那么就不会有对匿名思路方法需要了在本系列前面些文章中也曾提到lambda 表达式但并没有做太深入引述本文所要讲是Lambda表达式中lting将开始和大家体会lambda表达式些细节

  编译下面看看输出结果是不是大吃

using ;
using .Collections.Generic;
using .Linq;
  
Tester
{
   Program
  {
     void Main( args)
    {
      List<Func<>> list = List<Func<>>;
  
      for ( i = 0; i < 3; i)
      {
        list.Add( => i);
      }
  
      foreach (var item in list)
      {
        Console.WriteLine(item);
      }
    }
  }
}


  我们定义了个list其存储格式为func<>即返回代理而后用for循环将 i 封装进lambda表达式并加入到该list中而后用foreach循环输出结果lambda表达式其实质就是个代理也就指向个匿名所以使用item让所指向执行

  问题是你所盼望输出012而实际结果均是3为什么会这样呢?这牵扯到两个原因

  第在for循环中只能有个 i 变量即再第次循环时i 地址就分配好了不会循环次数多少而发生任何改变其改变只能是里面装载

  第 2lambda表达式在构造时 传进去是变量地址而不是具体值只有当真正执行这个lambda表达式时才会去确定它这就是为什么上面例子中其结果均为3(for循环在最后又给 i 加了1)

  我们可以很容易就将起解决掉在for循环中定义临时变量存储 i 值即可编译器会对该临时变量重新分配内存这样每次循环都重新分配新内存就不会有这个问题了再来运行下面这个例子

using ;
using .Collections.Generic;
using .Linq;
  
EnterpriseTester
{
   Program
  {
     void Main( args)
    {
      List<Func<>> list = List<Func<>>;
  
      for ( i = 0; i < 3; i)
      {
         temp = i;
        list.Add( => temp);
      }
  
      foreach (var item in list)
      {
        Console.WriteLine(item);
      }
    }
  }
}




  是不是满足了你要求了呢?这个temp就称为ltinglt是美语中电梯翻译为梯子或垫脚石比较妥帖

  2lting在Linq To Sql中影响

  Lambda表达式在Linq To Sql中大量应用这个问题势必要影响到其sql语句形成看下面例子

      keyWords = keyWords = { "111", "222", "333", "444" };
      SomeDataContext ctx = SomeDataContext ;
      var entitys = from e in ctx.Entity
              select e;
      foreach ( keyWord in keyWords)
      {
        entitys = entitys.Where(e => e.Text.Contains(keyWord));
      }
        var q = entitys.ToList;


  本意是想查找全部满足模糊匹配所有记录其实际生成sql语句中只传入了“%444%”加个lting吧问题就解决了

  大家可以用for循环替换foreach循环如果不加lting是不是抛异常了呢?自己研究下原因哦



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: