### LINQ学习笔记
#### 第一部分:准备工作
##### 第一章:匿名类型
**1.1 基础介绍**
匿名类型是C#提供的一种特殊类型,它可以在编译时自动生成类,并且该类只能在当前作用域内使用。匿名类型的一个显著特点是它们没有名字,但具有属性。在C#中,我们可以通过`var`关键字来声明匿名类型。
**1.2 var关键字的使用**
例如:
```csharp
var str = "Hello world!";
```
这里的`var`告诉编译器这是一个变量,而实际类型则由初始化器右侧的表达式推断得出。在这个例子中,`str`的类型被推断为`string`。
**1.3 匿名类型的特性**
- **不可修改性**:一旦声明了匿名类型,就无法修改其成员的类型或添加新的成员。
- **相等性的判断**:两个匿名类型的相等性不仅取决于它们的成员是否相等,还取决于这些成员的声明顺序、数量、类型以及名称是否完全相同。
**1.4 初始化器语法**
- **数组初始化器**:用于创建并初始化数组。
```csharp
var ints = new int[] { 1, 2, 3 };
```
- **对象初始化器**:用于创建并初始化具有指定属性的对象。
```csharp
var person = new { name = "三哥", age = 22 };
```
**1.5 匿名函数**
匿名函数是在运行时创建的函数,通常用于传递到其他方法中作为参数。C#中的匿名函数有两种形式:匿名方法和Lambda表达式。例如:
```csharp
Func<string, string, string> myFun = delegate(string i, string j) {
return i + "," + j;
};
```
这里定义了一个接受两个字符串参数并返回字符串的匿名函数。
**1.6 使用using语句**
`using`语句是一种更简洁的方式来处理实现了`IDisposable`接口的对象,确保在使用完毕后能够正确地释放资源。例如:
```csharp
using (var cnn = new SqlConnection("")) {
cnn.Open();
Console.WriteLine(cnn.State);
}
```
**1.7 匿名类型的相等性**
两个匿名类型被认为是相同的,如果它们具有相同的成员声明顺序、成员数量、成员投影类型以及成员名称。对于实例的比较,应使用`Equals`方法:
```csharp
var personA = new { name = "张三", age = 22 };
var personB = new { name = "张三", age = 22 };
bool isEqual = personA.Equals(personB);
```
**1.8 LINQ查询与匿名类型**
LINQ查询与匿名类型结合使用可以极大地简化数据处理。例如:
```csharp
var ints = new int[] { 1, 2, 3, 4, 5 };
var query = from i in ints where i > 2 select new { name = i };
foreach (var v in query) {
Console.WriteLine(v.name);
}
```
这段代码展示了如何使用匿名类型来存储LINQ查询的结果。
##### 第二章:复合类型初始化
**2.1 复合类型的定义**
复合类型是指由多个数据项组成的数据类型,例如类、结构体等。通过初始化复合类型,我们可以直接设置类或结构体的成员值。
**2.2 类型初始化示例**
例如:
```csharp
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
var person = new Person { Name = "三哥", Age = 22 };
```
**2.3 返回复合类型的方法**
我们也可以通过方法返回复合类型:
```csharp
public Person GetPerson() {
return new Person { Name = "小妹", Age = 20 };
}
```
**2.4 OfType方法与Cast方法**
- **OfType<T>()**:此方法仅返回集合中满足指定类型的元素。
- **Cast<T>()**:与`OfType<T>()`类似,但是当尝试转换失败时会抛出异常。
- **AsEnumerable()**:使对象表现得像一个可枚举的集合。当对象实现了与`IEnumerable`相似的方法时,可以显式指定使用哪个版本的方法。
例如:
```csharp
var mixedList = new object[] { 1, 2, "three", 4, "five" };
var intList = mixedList.OfType<int>();
foreach (var item in intList) {
Console.WriteLine(item);
}
```
以上是对LINQ学习笔记中提到的一些关键概念和用法的详细解释。通过这些知识点的学习,可以帮助开发者更好地理解并应用匿名类型、匿名函数、复合类型初始化等相关技术,在开发过程中实现更为高效和优雅的代码编写。