LINQ (Language Integrated Query) 是C#中最强大的特性之一,它让开发者能够以一种统一、直观的方式查询各种数据源。本文将深入探讨LINQ的进阶应用技巧,通过丰富的示例带您掌握LINQ的高级用法。
LINQ提供两种语法形式:查询表达式和方法语法。掌握这两种语法的优势,并能根据场景灵活切换是LINQ进阶的关键。
C#namespace AppLinq
{
internal class Program
{
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Major { get; set; }
public int Score { get; set; }
}
static void Main(string[] args)
{
// 创建一个学生列表
var students = new List<Student>()
{
new Student { Name = "张三", Age = 20, Major = "计算机科学", Score = 89 },
new Student { Name = "李四", Age = 21, Major = "计算机科学", Score = 92 },
new Student { Name = "王五", Age = 19, Major = "数学", Score = 78 },
new Student { Name = "赵六", Age = 22, Major = "物理", Score = 95 },
new Student { Name = "钱七", Age = 20, Major = "数学", Score = 85 },
new Student { Name = "孙八", Age = 21, Major = "物理", Score = 82 }
};
// 查询表达式:按专业分组,计算每个专业的平均分
var queryExpression = from student in students
group student by student.Major into majorGroup
select new
{
Major = majorGroup.Key,
AverageScore = majorGroup.Average(s => s.Score),
StudentCount = majorGroup.Count()
};
// 方法语法:实现相同功能
var methodSyntax = students
.GroupBy(s => s.Major)
.Select(g => new
{
Major = g.Key,
AverageScore = g.Average(s => s.Score),
StudentCount = g.Count()
});
// 混合使用:先用查询表达式过滤,再用方法语法进行复杂处理
var hybridQuery = (from student in students
where student.Score >= 80
select student)
.OrderByDescending(s => s.Score)
.Take(3);
// 输出结果
foreach (var result in queryExpression)
{
Console.WriteLine($"专业: {result.Major}, 平均分: {result.AverageScore:F2}, 学生数: {result.StudentCount}");
}
foreach (var result in methodSyntax)
{
Console.WriteLine($"专业: {result.Major}, 平均分: {result.AverageScore:F2}, 学生数: {result.StudentCount}");
}
foreach (var result in hybridQuery)
{
Console.WriteLine($"姓名:{result.Name} {result.Major}");
}
Console.ReadKey();
}
}
}

LINQ重中之重,LINQ(Language-Integrated Query)是C#中的一组技术,用于查询内存中的数据。LINQ to Objects是指使用LINQ查询.NET中的对象集合(如数组、列表等)。
LINQ是一种查询语法,它允许开发者以声明性的方式查询数据,无论这些数据是来自数据库、XML文档还是内存中的集合。
LINQ to Objects指的是对内存中的对象集合(如数组、列表)进行查询。它允许我们使用强类型的方式来查询集合中的数据。
查询表达式是LINQ查询的一种语法,它看起来很像SQL语句。查询表达式通常由from、where、select、orderby等子句组成。
LINQ查询具有延迟执行的特性,即查询表达式定义了一个查询计划,但直到你迭代访问结果时,查询才真正执行。
Node.js 提供了许多内置的方法来创建和删除目录。在本文中,我们将详细讲解如何在Node.js中操作目录,并提供一些完整的示例代码。
fs 模块所有的文件和目录操作都需要使用 fs 模块,这是 Node.js 提供的文件系统模块。首先,引入 fs 模块:
JavaScriptconst fs = require('fs');
const path = require('path');
注意: 你可能也会使用
path模块来进行路径操作,如拼接路径、解析路径等。
在Node.js中,处理文件是一个常见的任务,Node.js提供了一些内置的模块来帮助我们轻松地完成文件读写操作。本文将详细介绍如何在Node.js中进行文件读写,并提供丰富的示例代码。
fs 模块fs 模块是Node.js的核心模块之一,用于文件系统操作。在开始文件操作之前,我们需要先引入这个模块:
JavaScriptconst fs = require('fs');
fs.readFileSync 方法用于同步读取文件。它是一个阻塞操作,读取文件的内容并返回其内容。
参数说明:
path: 要读取的文件的路径。options (可选): 用于指定编码或标志。默认情况下,它是 null。JavaScriptconst fs = require('fs');
try {
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
在C#中,我们可以使用System.IO命名空间提供的类和方法来操作CSV(逗号分隔值)文件。以下是一个通用的CSV文件操作类的示例代码,详细说明了如何实现常见的读取和写入CSV文件的功能。
C#public class CsvFile
{
private string filePath;
private char delimiter;
public CsvFile(string filePath, char delimiter = ',')
{
this.filePath = filePath;
this.delimiter = delimiter;
}
public List<string[]> ReadAll(System.Text.Encoding encoding)
{
List<string[]> data = new List<string[]>();
try
{
using (StreamReader reader = new StreamReader(filePath, encoding)
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] values = line.Split(delimiter);
data.Add(values);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
return data;
}
public void WriteAll(List<string[]> data)
{
try
{
using (StreamWriter writer = new StreamWriter(filePath))
{
foreach (string[] values in data)
{
string line = string.Join(delimiter.ToString(), values);
writer.WriteLine(line);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}