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相关特性的更多相关文章

  1. 白话LINQ系列1---什么是LINQ?

    一.本系列目标 1.理解LINQ: 2.能写得复杂的LINQ语句(比如:动态查询): 3.理解表达式树及相关概念: 4.熟练运用LINQ写出优美的代码(希望一起努力,最终达到): 二.LINQ为何物? ...

  2. [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)

    [原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...

  3. Flink-1.10中的StreamingFileSink相关特性

    一切新知识的学习,都离不开官网得相关阅读,那么StreamingFileSink的官网介绍呢? https://ci.apache.org/projects/flink/flink-docs-rele ...

  4. 在VB中使用Linq To SQLite注意事项

    昨天使Linq To SQLite 支持VB,今天在VB中写了几条Linq语句,发现了几个问题: 1.在Linq To SQLite中的Linq语句查询后并不是得到的匿名数据类,而是将Linq转换为S ...

  5. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  6. Linq之旅:Linq入门详解(Linq to Objects)【转】

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...

  7. Linq之旅:Linq入门详解(Linq to Objects)(转)

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...

  8. LINQ中的"延迟查询"特性【转】

    本文转载自:LINQ中的"延迟查询"特性 详细了解“延迟查询”:C#学习笔记(八)—–LINQ查询之延迟执行 很多标准查询操作符的设计原型都是返回一个IEnumerable< ...

  9. LINQ系列目录

    1. LINQ准备 1.1 C#中与LINQ相关特性 2. LINQ to Object 2.1 LINQ to Object投影操作符(Select/SelectMany/Let) 2.2 LINQ ...

随机推荐

  1. Android MVP 利用rxjava 避免向Model传入监听方法

    传统的MVP: 1.抽离出View的接口,即ILoginView. 2.抽离Model的接口,即ILoginModel. 3.抽离Presenter的接口,即ILoginPresenter. 4.实现 ...

  2. [Leetcode] Contains Duplicate III

    Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...

  3. HDU 5008 Boring String Problem(后缀数组+二分)

    题目链接 思路 想到了,但是木写对啊....代码 各种bug,写的乱死了.... 输出最靠前的,比较折腾... #include <cstdio> #include <cstring ...

  4. 试用avalon2.0

    一直从事后端开发,对于前端的html+css+js,不熟不熟的.前面写了一个比较复杂的操作界面,我只能说,误工费时.花了一周研究avalonjs2,大神的确就是大神,解决了我很多的问题, 请参考htt ...

  5. HTML5

    一.头部设置 <!--页面窗口自动调整到设备宽度,并禁止用户及缩放页面--> <meta name="viewport" content="width= ...

  6. Apache error: 403 Forbidden You don't have permission to access

    CentOS 6 solution: chcon -t httpd_sys_content_t -R /directory refer to: https://www.centos.org/forum ...

  7. 将Web应用发布到tomcat中的三种方法

    坑啊,为什么网易的博客不能搬过来!!!我一个一个复制过来容易嘛!!!!原文地址:http://buffalo-l.blog.163.com/blog/static/244954022201539111 ...

  8. android 之httpclient方式提交数据

    HttpClient: 今天实战下httpclient请求网络json数据,解析json数据返回信息,显示在textview, 起因:学校查询饭卡余额,每次都要访问校园网(内网),才可以查询,然后才是 ...

  9. SQL Server

    1.通过触发器来级联删除: 具体的触发器代码如下: Create TRIGGER [dbo].[DeleteRelatedProducts] ON [dbo].[ProductCategory]  A ...

  10. 【SQLServer】“无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法

    从今天起,把编程中遇到的所有问题都记录下来,以便今后参考,以及方便网友查阅,希望我的问题可以帮助到很多志同道合的人们,我也是受很多前辈的提点,一步一步走来,希望大家都不要吝啬,将自己遇到的问题记录下来 ...