当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > LINQ学习笔记:对象初始化器

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

ASP.NET 中的 LINQ学习笔记:对象初始化器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 257 ::
收藏到网摘: n/a

对象初始化器

到目前, 我们所有的select语句都返回了包含单一元素的类型. 使用C#的对象初始化器, 我们可以构造更加复杂的类型. 例如, 我们想构造一个查询, 用来去除一个名字列表中的所有元素中包含的元音字符, 并且最后仍然要包含原始值. 我们可以构造以下的类型来协助:

 1: class TempProjectionItem
 2: {
 3: public string Original;
 4: public string Vowelless;
 5: }

然后我们使用对象初始化器来将值注入:

 1: IEnumerable<TempProjectionItem> temp =
 2: from n in names
 3: select new TempProjectionItem
 4: {
 5: Original = n,
 6: Vowelless = n.Replace ("a", "").Replace ("e", "").
 7: Replace ("i", "").Replace ("o", "").Replace ("u", "")
 8: };

其返回类型是IEnumerable<TempProjectionItem>, 我们可以使用它来做进一步的子查询:

 1: IEnumerable<string> query = from item in temp
 2: where item.Vowelless.Length > 2
 3: select item.Original;

匿名类型

匿名类型允许你构造在没有编写特殊类型的情况下构造中间结果值. 例如在上面的例子中, 我们如果使用匿名类型的话则完全可以去掉TempProjectionItem类:

 1: var intermediate = from n in names 
 2: select new
 3: {
 4: Original = n,
 5: Vowelless = Regex.Replace (n,"[aeiou]", "")
 6: };
 7:  
 8: IEnumerable<string> query1 =
 9: from item in intermediate
 10: where item.Vowelless.Length > 2
 11: select item.Original;

这个查询会得到和上面一样的结果, 但是却不必要编写那个只使用一次的数据类, 编译器会在后端创建一个临时类, 此临时类会根据查询产生的投影值的数据类型产生对应的字段. 这意味着, 这个intermediate的查询拥有一个这样的类型:

IEnumerable<random-compiler-produced-name>, 要声明一个这样的类似, 唯一的办法只有使用var关键字.

使用into的话我们还可以让整个查询更加简洁:

 1: var query = from n in names
 2: select new
 3: {
 4: Original = n,
 5: Vowelless = Regex.Replace (n,"[aeiou]", "")
 6: }
 7: into temp
 8: where temp.Vowelless.Length > 2
 9: select temp.Original;

let关键字

let关键字是一个紧靠枚举变量的新的变量. 使用let, 我们像下面这样编写一个查询来解析那些去掉元音字符之后长度依然大于2的字符串:

 1: string[] names = {"Tom","Dick","Harry","Mary","Jay" };
 2: IEnumerable<string> query =
 3: from n in names
 4: let vowelless = Regex.Replace (n,"[aeiou]", "")
 5: where vowelless.Length > 2
 6: orderby vowelless
 7: select n; //因为使用了let, n依然还在可用范围内

编译器将let子句翻译成一个临时的匿名类型, 此匿名类型包含了迭代变量和新的表达式变量. 换句话说, 编译器将这个查询转换成我们之前提到的例子. 待续!