LINQ to Objects系列(1)相关技术准备

  LINQ to
Objects是LINQ的一部分,是查询对象集合的一种语法。首先看一下LINQ的体系结构,这样对LINQ有一个大致的了解。如图。

第一篇文章主要是回顾一下学习LINQ to Objects相关的基础知识,主要分为以下几个方面。

1,隐式类型局部变量

2,匿名类型

3,扩展方法

4,对象初始化器

5,集合初始化器

6,Lambda表达式

隐式类型局部变量

隐式类型局部变量,从名字中可以得出两层含义,一是隐式类型,即相对于显式类型(或称为强类型)而言的,指不需要指定具体类型,而是由右边表达式推断出的类型。第二层含义是局部变量,指的是只能用于方法内部的局部变量,不能用在字段或方法参数上。隐式类型局部变量通常是用var关键字表示的。演示代码如下。


//原来写法
string userName = "James";
int age = 29;
string[] userList = new string[] { "a","b","c"};
foreach (string user in userList)
{
Console.WriteLine(user);
}

//现在写法
var userName = "mcgrady";
var age = 29;
var userList = new[] { "a", "b", "c" };
foreach (var user in userList)
{
Console.WriteLine(user);
}

匿名类型


匿名类型是C#的一种新特性,通常我们创建类型对象都是通过new关键字再跟上类名来创建的,但是匿名类型却不需要指定类型名称,而是由编译器为我们自动创建一个类型名称,而且不会告诉我们这个类型名称是什么。匿名类型又称为行内类型,通常与var关键字配合使用。演示代码如下。


var data = new { UserName = "mcgrady", Age = "29" };
Console.WriteLine("UserName:{0},Age:{1}", data.UserName, data.Age);

扩展方法

扩展方法使我们当我们没有源代码的情形下,仍可以对CLR类型或自定义类型进行一些扩展操作。同时它也是学习LINQ to
Objects的基础。另外,扩展方法只能定义在静态类的静态方法中,并且如果扩展方法名不能同原方法名同名,否则扩展方法将会失效。演示代码如下。


public static class StringExtension
{
/// <summary>
/// 将当前字符串转换为int
/// </summary>
/// <param name="str"></param>
/// <param name="result"></param>
/// <returns>如果成功则返回字符串的int形式,如果失败则返回默认值</returns>
public static int ToInt(this string str, int result = -110)
{
int value;
if (int.TryParse(str, out value))
{
return value;
}
else
{
return result;
}
}
}

//扩展方法调用
string str = "111";
int result = str.ToInt();

对象初始化器


在没有对象初始化器之前,我们创建一个对象大概需要经过这么两个步骤,首先new一个对象,然后给每个字段赋值。而有了对象初始化器之后,原本需要几行代码才能完成的任务变成一行代码就可以完成,简化了代码,也使代码更优雅。演示代码如下。


//原来写法
Person person = new Person();
person.UserName = "James";
person.Age = 28;

//现在写法
Person person = new Person { UserName = "James", Age = 28 };
Console.WriteLine("UserName:{0},Age:{1}", person.UserName, person.Age);

集合初始化器


使用集合初始化器,编译器会自动帮我们生成Add插入操作,前提是集合实现了IEnumerable接口。同对象初始化器一样,使用集合初始化器增强代码可读性的同时使我们写的代码量更少了。演示代码如下。


//原来写法
List<Person> personList = new List<Person>();
personList.Add(new Person { UserName = "Wade", Age = 28 });
personList.Add(new Person{ UserName="Bosh", Age=25});
personList.Add(new Person { UserName = "James", Age = 29 });

//现在写法(使用集合初始化器)
List<Person> newPersonList = new List<Person>
{
new Person{ UserName="Wade", Age=28},
new Person{ UserName="Bosh", Age=25},
new Person{ UserName="James", Age=29}
};

Lambda表达式


lambda表达式可以简单地理解为:它是在匿名方法的基础上,再进一步地简化了创建委托实例所需要的代码。后面会有一篇文章专门总结lambda表达式,它的语法格式为:(参数列表)
=> 表达式或者语句块,下面是一个简单的示例。


//lambda表达式
var selectionPerson = newPersonList.Where(p => p.Age > 25).Select(p => p.UserName.ToUpper());
foreach (var item in selectionPerson)
{
Console.WriteLine(item);
}

时间: 2024-10-05 10:07:01

LINQ to Objects系列(1)相关技术准备的相关文章

LINQ to Objects系列(2)两种查询语法介绍

LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查询语法的简单示例 一个LINQ查询既可以使用查询表达式实现,也可以用查询方法实现,还可以同时组合两种查询.下面是一个简单的示例,代码如下. namespace LINQDemo3 { class Program { static void Main(string[] args) { int[] nu

LINQ to Objects系列(3)深入理解Lambda表达式

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

LINQ to Objects系列(4)表达式树

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

Linq之Linq to Objects

目录 写在前面 系列文章 linq to objects 总结 写在前面 上篇文章介绍了linq的延迟加载特性的相关内容,从这篇文章开始将陆续介绍linq to Objects,linq to xml,linq to sql等内容. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 Linq之扩展方法 Linq之Expression初见 Linq之Expression进阶 Linq之Expression高级篇(常用表达式类

从LINQ开始之LINQ to Objects(上)

LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LINQ总共包括五个部分:LINQ to Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML.LINQ to Objects:对内存中集合的操作LINQ to DataSets:对数据集Datatable的操作LINQ to

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

示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集成查询).通过LINQ,我们可以使用相同API操作不同的数据源.接下来就让我们看看LINQ是什么以及如何使用? 再此之前,需要先了解的相关技术 1. 隐式类型.匿名类型.对象初始化器 1) 隐式类型,使用var关键字创建,C#编译器会根据用于初始化局部变量的初始值推断出变量的数据类型.(不过我个人认

从LINQ开始之LINQ to Objects(下)

前言 上一篇<从LINQ开始之LINQ to Objects(上)>主要介绍了LINQ的体系结构.基本语法以及LINQ to Objects中标准查询操作符的使用方法.本篇则主要讨论LINQ to Objects中的扩展方法以及延迟加载等方面的内容. 扩展方法 扩展方法简介 扩展方法能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或其他方式修改原始类型.扩展方法是静态方法,它是类的一部分,但实际没有放在类的源代码当中.下面,我们来看一个简单示例,为上一篇中定义的

LinQ To Objects 高级查询方法

什么是LinQ To Objects? 用一个例子解释,首先定义一个数组,查询数组中的最大值: int[] arr = { 123, 2, 3, 45, 654, 2324, 897, 56, 6554, 4, 3, 6, 8, 434 }; 旧的方法: int max=0 ; foreach(int a in arr) { if(a>=max) max=a; } Console.Write("最大值:"+ max); LinQ To Objects方法: Console.Wri

查询表达式和LINQ to Objects

查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据模型之间的阻抗失配过程中,遇到的一个问题就是,通常会涉及创建另一个模型来作为桥梁 序列 它通过IEnumerable和IEnumerable<T>接口进行封装 序列和其他集合数据结构最大的区别:当你从序列读取数据的时候,通常不知道还有多少数据项等待读取,或者不能访问任意的数据项——只能是当前这个