LINQ系列:C#中与LINQ相关特性
1. 匿名类型
通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型。
使用匿名类型时要遵守的一些基本规则:
◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null),因为类型是根据初始化器推断出来的;
◊ 匿名类型可以用于简单类型,也可以用于复杂类型。用于定义简单类型时,其价值不大。复合匿名类型需要有成员声明;
◊ 匿名类型不能用于类的字段;
◊ 匿名类型可以在for循环中用作初始化器;
◊ 可以使用new关键字;数组的初始化器必须使用new关键字;
◊ 匿名类型可以用于数组;
◊ 所有匿名类型都派生自Object类型;
var title = "LINQ to Object";
1.1 复合匿名类型
var product = new { Title = "LINQ to Object", UnitPrice = 10m };
1.2 在for/foreach语句中使用匿名类型
var fibonacci = new int[] { , , , , , , , };
for (var i = ; i < fibonacci.Length; i++)
{
Console.WriteLine(fibonacci[i]);
}
var fibonacci = new int[] { , , , , , , , };
foreach (var number in from f in fibonacci where f > select f)
{
Console.WriteLine(number);
}
1.3 匿名类型与using
using( var connection = new SqlConnection(connectionString))
{
connection.Open();
// ......
}
2. 数组初始化器
使用关键字new初始化数组。
var fibonacci = new int[]{ , , , , , , , };
3. 匿名泛型方法
Func<long, long> Factorial = delegate(long n)
{
if (n == )
{
return ;
} long result = ;
for (int i = ; i <= n; i++)
{
result *= i;
}
return result;
}; Console.WriteLine(Factorial());
// using System.Diagnostics;
Func<long, long> Factorial = delegate(long n)
{
return n > ? n * (long)(new StackTrace()
.GetFrame()
.GetMethod()
.Invoke(null, new object[] { n - }))
: n;
}; Console.WriteLine(Factorial());
4. 自动实现属性
public string ProductName { get; set; }
设置只读属性:
public string ProductName { get; private set; }
5.对象初始化器和集合初始化器
对象初始化器:在不调用类的构造函数以声明性方式创建一个新的对象,并设置该对象的各个属性的值。
Product product = new Product
{
ProductID = ,
ProductName = "LINQ to Object",
UnitPrice = 10m
};
集合初始化器用来初始化一个集合。
List<int> num = new List<int> { , , , , , , };
结合对象初始化器使用:
List<Product> products = new List<Product> {
new Product { ProductID = , ProductName = "LINQ to Object", UnitPrice = 10m },
new Product { ProductID = , ProductName = "LINQ to ADO.NET", UnitPrice = 20m }
};
6. Lambda表达式
Lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
Lambda表达式的基本形式:
(input parameters) => expression
其中,input parameters表示输入参数,expression表示表达式。输入参数的数量可以为空,1个或多个。
当输入参数为空是,Lambda表达式左边的()不能省略。
() => Console.WriteLine("Empty");
Func<DateTime> getDateTime = () => DateTime.Now;
当Lambda表达式的输入参数的数量为1时,输入参数的()可以省略。
x => x * x;
当Lambda表达式的输入参数的数量大于1时,输入参数的()是必须的,且参数之间使用逗号分隔。
(x, y) => x * y;
Lambda的delegate形式转换:
delegate(int x) { return x * x; };
7. 查询表达式
var products = from p in ctx.Products
where p.UnitPrice > 10m
select p;
8. 扩展方法
扩展方法是C#中一个重要的特性,其对于LINQ的实现起着关键的作用。扩展方法在使用上类似于静态方法,但在本质上其是实例方法。
扩展方法在参数前加上this关键字,参数的类似表示这个扩展方法要对这个类型进行扩展。
public static class Extensions
{
public static bool IsValidEmailAddress(this string value)
{
Regex regex = new Regex(@"^[\w\.]+@([\w]+\.)+[\w]{2,4}$");
return regex.IsMatch(value);
}
}
关联随笔:C# LINQ需求实现演化
LINQ系列:C#中与LINQ相关特性的更多相关文章
- 白话LINQ系列1---什么是LINQ?
一.本系列目标 1.理解LINQ: 2.能写得复杂的LINQ语句(比如:动态查询): 3.理解表达式树及相关概念: 4.熟练运用LINQ写出优美的代码(希望一起努力,最终达到): 二.LINQ为何物? ...
- [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)
[原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...
- Flink-1.10中的StreamingFileSink相关特性
一切新知识的学习,都离不开官网得相关阅读,那么StreamingFileSink的官网介绍呢? https://ci.apache.org/projects/flink/flink-docs-rele ...
- 在VB中使用Linq To SQLite注意事项
昨天使Linq To SQLite 支持VB,今天在VB中写了几条Linq语句,发现了几个问题: 1.在Linq To SQLite中的Linq语句查询后并不是得到的匿名数据类,而是将Linq转换为S ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
- Linq之旅:Linq入门详解(Linq to Objects)(转)
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...
- LINQ中的"延迟查询"特性【转】
本文转载自:LINQ中的"延迟查询"特性 详细了解“延迟查询”:C#学习笔记(八)—–LINQ查询之延迟执行 很多标准查询操作符的设计原型都是返回一个IEnumerable< ...
- LINQ系列目录
1. LINQ准备 1.1 C#中与LINQ相关特性 2. LINQ to Object 2.1 LINQ to Object投影操作符(Select/SelectMany/Let) 2.2 LINQ ...
随机推荐
- 采用Lambda表达式快速实现实体模型对象转换到DTO
在项目中,采用code first时建立的模型对象不能直接用于数据传输,需要从新根据需求建立Dto对象 为什么需要建立Dto对象呢? DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来 ...
- spark scala学习笔记
搞清楚几个概念: 闭包 柯里化 搭建了intellij idea 的scala 开发环境
- Linux下添加apache虚拟主机
一切在确保apache被正确安装的前提下 设置虚拟主机 创建虚拟目录 现在,让我们继续安装虚拟主机.虚拟主机命名为local.gis. 创建一个公用的文件夹来存放这虚拟主机的数据. 首先,让我们为lo ...
- 【异常】No ManagedConnections available within configured blocking timeout
Caused by: org.jboss.util.NestedSQLException: No ManagedConnections available within configured bloc ...
- BestCoder Round 70
惨败,不能再嘲笑别人了,否则自己也会像别人那样倒霉 HDU 5615:http://acm.hdu.edu.cn/showproblem.php?pid=5615 求ax^2+bx+c能否拆成(px+ ...
- seajs学习一天后的总结归纳
公司项目最近需要将js文件迁移到seajs来进行模块化管理,由于我以前主要接触模块化开发是接触的AMD规范的requireJS,没有接触过CMD规范,而且在实际项目中还没有用过类似技术.于是,我非常兴 ...
- 让/etc/profile文件修改后立即生效
方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile ...
- shell命令获取最新文件的名称
最近有一个需求,在部署游戏战场服时,从程序包到部署需要做一些本地化的操作,手工操作费时费力,故写一个shell脚本,一键部署. 遇到的问题是每次要部署最新的程序包,因此需要shell命令获取最新的文件 ...
- RequireJS与SeaJS模块化加载示例
web应用越变的庞大,模块化越显得重要,尤其Nodejs的流行,Javascript不限用于浏览器,还用于后台或其他场景时,没有Class,没有 Package的Javascript语言变得难以管理, ...
- Akka-remote使用入门
在上一篇文章中讲了akka-actor的简单使用,那主要是展现了akka在一台机器上的并发应用,这一篇接着介绍akka-remote使用,简单了解akka在不同机器上的并发应用.我们知道,在一台机器上 ...