C# LINQ 详细用法以及概念

发布于:2024-07-11 ⋅ 阅读:(136) ⋅ 点赞:(0)

LINQ(Language Integrated Query)是C#和.NET框架中的一个强大功能,它允许开发者使用查询语法来访问和操作数据集合。LINQ提供了一种一致且直观的方式来处理不同类型的数据源,如集合、XML文档、数据库等。本文将详细讲解LINQ的各种属性和方法,以及如何在实际应用中使用它们。

1. LINQ 简介

LINQ 提供了一种声明性的语法,类似于SQL,可以对任何实现了 IEnumerable<T>IQueryable<T> 接口的数据源进行查询。它有以下几个主要的部分:

  • LINQ to Objects:对内存中的对象进行查询。
  • LINQ to XML:对XML数据进行查询。
  • LINQ to SQL:对SQL数据库进行查询。
  • LINQ to Entities:对Entity Framework数据模型进行查询。

2. 基本语法

2.1 查询表达式

查询表达式类似于SQL语法,主要由fromwhereselect等子句组成。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };

// 定义查询表达式
var result = from n in numbers
             where n % 2 == 0
             select n;

// 执行查询
foreach (var n in result)
{
    Console.WriteLine(n);
}

2.2 方法语法

LINQ也可以使用方法调用链来表达查询,这种语法通常与Lambda表达式一起使用。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };

// 定义查询
var result = numbers.Where(n => n % 2 == 0).Select(n => n);

// 执行查询
foreach (var n in result)
{
    Console.WriteLine(n);
}

3. 常用方法

3.1 Where

Where 方法用于筛选数据集合中的元素。它接受一个返回布尔值的Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var n in evenNumbers)
{
    Console.WriteLine(n); // 输出 2 和 4
}

3.2 Select

Select 方法用于将数据集合中的每个元素投射为新的形式。它接受一个Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n);

foreach (var n in squaredNumbers)
{
    Console.WriteLine(n); // 输出 1, 4, 9, 16, 25
}

3.3 OrderBy 和 OrderByDescending

OrderByOrderByDescending 方法用于对数据集合进行排序。它们接受一个用于排序的键选择器Lambda表达式。例如:

string[] names = { "Charlie", "Bob", "Alice" };
var sortedNames = names.OrderBy(name => name);

foreach (var name in sortedNames)
{
    Console.WriteLine(name); // 输出 Alice, Bob, Charlie
}

var sortedNamesDesc = names.OrderByDescending(name => name);

foreach (var name in sortedNamesDesc)
{
    Console.WriteLine(name); // 输出 Charlie, Bob, Alice
}

3.4 GroupBy

GroupBy 方法用于将数据集合中的元素分组。它接受一个分组键选择器Lambda表达式。例如:

string[] words = { "apple", "banana", "apricot", "blueberry", "cherry" };
var groupedWords = words.GroupBy(word => word[0]);

foreach (var group in groupedWords)
{
    Console.WriteLine($"Key: {group.Key}");
    foreach (var word in group)
    {
        Console.WriteLine(word);
    }
}

3.5 Join

Join 方法用于连接两个数据集合。它接受四个参数:外部集合、内部集合、外键选择器、内键选择器和结果选择器。例如:

var students = new[]
{
    new { StudentId = 1, Name = "Alice" },
    new { StudentId = 2, Name = "Bob" }
};

var scores = new[]
{
    new { StudentId = 1, Score = 90 },
    new { StudentId = 2, Score = 85 }
};

var studentScores = students.Join(
    scores,
    student => student.StudentId,
    score => score.StudentId,
    (student, score) => new { student.Name, score.Score }
);

foreach (var studentScore in studentScores)
{
    Console.WriteLine($"{studentScore.Name}: {studentScore.Score}");
}

4. 高级用法

4.1 集合运算符

LINQ 提供了一些集合运算符,如 UnionIntersectExcept,用于对集合进行并集、交集和差集操作。例如:

int[] set1 = { 1, 2, 3 };
int[] set2 = { 3, 4, 5 };

var union = set1.Union(set2); // { 1, 2, 3, 4, 5 }
var intersect = set1.Intersect(set2); // { 3 }
var except = set1.Except(set2); // { 1, 2 }

foreach (var n in union) { Console.WriteLine(n); }
foreach (var n in intersect) { Console.WriteLine(n); }
foreach (var n in except) { Console.WriteLine(n); }

4.2 聚合函数

LINQ 提供了一些聚合函数,如 CountSumAverageMinMax,用于对集合进行聚合计算。例如:

int[] numbers = { 1, 2, 3, 4, 5 };

int count = numbers.Count(); // 5
int sum = numbers.Sum(); // 15
double average = numbers.Average(); // 3
int min = numbers.Min(); // 1
int max = numbers.Max(); // 5

Console.WriteLine($"Count: {count}, Sum: {sum}, Average: {average}, Min: {min}, Max: {max}");

4.3 转换运算符

LINQ 提供了一些转换运算符,如 ToListToArrayToDictionary,用于将查询结果转换为其他集合类型。例如:

int[] numbers = { 1, 2, 3, 4, 5 };

List<int> numberList = numbers.ToList();
int[] numberArray = numbers.ToArray();
Dictionary<int, int> numberDictionary = numbers.ToDictionary(n => n, n => n * n);

foreach (var n in numberList) { Console.WriteLine(n); }
foreach (var n in numberArray) { Console.WriteLine(n); }
foreach (var kvp in numberDictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); }

5. 实际应用中的例子

5.1 处理数据库

LINQ to SQL 或 LINQ to Entities(EF)可以用于查询数据库。例如,使用 Entity Framework:

using (var context = new SchoolContext())
{
    var students = context.Students.Where(s => s.Age > 18).ToList();

    foreach (var student in students)
    {
        Console.WriteLine($"{student.Name}, {student.Age}");
    }
}

5.2 处理XML

LINQ to XML 可以用于查询和操作XML文档。例如:

XDocument doc = XDocument.Load("books.xml");

var books = from book in doc.Descendants("book")
            where (int)book.Element("price") > 30
            select new
            {
                Title = (string)book.Element("title"),
                Price = (int)book.Element("price")
            };

foreach (var book in books)
{
    Console.WriteLine($"{book.Title}, {book.Price}");
}

LINQ 在 C# 中非常强大且灵活的功能,它提供了多种操作数据集合的方式,让我们的代码更加简洁和可读。本文记录一下这些常用到的,以后可以来翻一翻