商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

LINQ的演变及其对C# 设计的影响

作者:cobra  2008-01-15
【IT168技术文档】
  此接口要求每个实现器都应编写适用于两种重载的实现。有了“Orcas”版 C#,接口变得很简单:
interface IDog {   void Bark(int seconds); }

  扩展方法可添加到另一个类:

static class DogExtensions {   // Barks for 2 seconds   public static void Bark(this IDog dog)   {   dog.Bark(2);   } }

  接口实现器现在只需实现单一方法,但接口客户端却可以自由调用任一重载。

  Close [x]

  我们现在拥有了用于编写筛选子句的非常接近理想的语法,但“Orcas”版 C# 仅限于此吗?并不全然。让我们对示例稍作扩展,相对于整个客户对象,我们只投影出客户名称。如我前面所述,理想的语法应采用如下形式:

sequence locals =customers.where(ZipCode == 98112).select(Name);
  仅用我们讨论过的语言扩展,即 lambda 表达式和扩展方法,此代码可重新编写为如下所示:
IEnumerable locals = customers.Where(c => c.ZipCode == 91822).Select(c => c.Name);
  请注意,此查询的返回类型不同,它是 IEnumerable 而不是 IEnumerable。这是因为我们仅从 select 语句中返回客户名称。

  当投影只是单一字段时,该方法确实很有效。但是,假设我们不仅要返回客户的名称,还要返回客户的地址。理想的语法则应如下所示:
locals = customers.where(ZipCode == 98112).select(Name, Address);
  匿名类型

  如果我们想继续使用我们现有的语法来返回名称和地址,我们很快便会面临问题,即不存在仅包含 Name 和 Address 的类型。虽然我们仍然可以编写此查询,但是必须引入该类型:
class CustomerTuple {   public string Name;   public string Address;   public CustomerTuple(string name, string address)   {   this.Name = name;   this.Address = address;   } }
  然后我们才能使用该类型,即此处的 CustomerTuple,以生成我们查询的结果。
IEnumerable locals =customers.Where(c => c.ZipCode == 91822).Select(c =new CustomerTuple(c.Name, c.Address));拼吾爱
1 2 3
【内容导航】
第1页: 概述 第2页: 第2页
第3页: 第3页
©版权所有。未经许可,不得转载。
[责任编辑:nancy]
[an error occurred while processing this directive]