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

ASP.NET
C# Quoted-Printable编码、解码
asp.net Google的translate工具翻译 API
.NET读取所有目录下文件正则匹配文本电子邮件
asp.net 半角全角转化工具
AjaxControlToolKit 显示浏览者本地语言的方法
asp.net HTML文件上传标签
ASP.NET 绑定DataSet中的多个表
ASP.NET 重定向的几种方法小结
Asp.Net 重定向必须要知道的一些资料
ASP.NET 导出到Excel时保留换行的代码
Asp.Net Cache缓存使用代码
document.getElementsByName和document.getElementById 在IE与FF中不同实现
GridView单元格合并
asp.net 大文件上传控件
asp.net 日期函数 某月的第一天和最后一天的日期
asp.net 时间类 一周的周一和周末的日期
C# javaScript函数的相互调用
asp.net membership 密码重设
"虚拟路径"..."映射到另一个应用程序,这是不允许的!
如何传值在2个页面之间 要求不刷新父页面,并且不能用Querystring传值

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 275 ::
收藏到网摘: 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子句翻译成一个临时的匿名类型, 此匿名类型包含了迭代变量和新的表达式变量. 换句话说, 编译器将这个查询转换成我们之前提到的例子. 待续!