跳到主要内容

C# LINQ 转换

介绍

在 C# 中,LINQ(Language Integrated Query)是一种强大的工具,用于查询和操作数据。LINQ 不仅支持查询操作,还提供了多种数据转换功能。通过 LINQ 转换操作符,您可以将数据从一种形式转换为另一种形式,例如将集合转换为数组、列表、字典或其他数据结构。

本文将详细介绍 C# LINQ 中的转换操作符,并通过代码示例和实际案例帮助您理解其用法。

LINQ 转换操作符

LINQ 提供了多种转换操作符,以下是一些常用的转换操作符:

  • ToArray():将集合转换为数组。
  • ToList():将集合转换为列表。
  • ToDictionary():将集合转换为字典。
  • ToLookup():将集合转换为查找表。
  • Cast<T>():将集合中的元素转换为指定类型。
  • OfType<T>():筛选集合中指定类型的元素。

1. ToArray()

ToArray() 方法将集合转换为数组。以下是一个简单的示例:

csharp
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var array = numbers.ToArray();

Console.WriteLine(string.Join(", ", array)); // 输出: 1, 2, 3, 4, 5

2. ToList()

ToList() 方法将集合转换为列表。以下是一个示例:

csharp
var numbers = new int[] { 1, 2, 3, 4, 5 };
var list = numbers.ToList();

Console.WriteLine(string.Join(", ", list)); // 输出: 1, 2, 3, 4, 5

3. ToDictionary()

ToDictionary() 方法将集合转换为字典。您需要提供一个键选择器和一个值选择器。以下是一个示例:

csharp
var students = new List<Student>
{
new Student { Id = 1, Name = "Alice" },
new Student { Id = 2, Name = "Bob" },
new Student { Id = 3, Name = "Charlie" }
};

var dictionary = students.ToDictionary(s => s.Id, s => s.Name);

foreach (var kvp in dictionary)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
// 输出:
// Key: 1, Value: Alice
// Key: 2, Value: Bob
// Key: 3, Value: Charlie

4. ToLookup()

ToLookup() 方法将集合转换为查找表。查找表类似于字典,但允许一个键对应多个值。以下是一个示例:

csharp
var students = new List<Student>
{
new Student { Id = 1, Name = "Alice", Grade = "A" },
new Student { Id = 2, Name = "Bob", Grade = "B" },
new Student { Id = 3, Name = "Charlie", Grade = "A" }
};

var lookup = students.ToLookup(s => s.Grade);

foreach (var group in lookup)
{
Console.WriteLine($"Grade: {group.Key}");
foreach (var student in group)
{
Console.WriteLine($" {student.Name}");
}
}
// 输出:
// Grade: A
// Alice
// Charlie
// Grade: B
// Bob

5. Cast<T>()

Cast<T>() 方法将集合中的元素转换为指定类型。如果集合中的元素无法转换为指定类型,则会抛出异常。以下是一个示例:

csharp
var objects = new List<object> { 1, 2, 3, 4, 5 };
var numbers = objects.Cast<int>();

Console.WriteLine(string.Join(", ", numbers)); // 输出: 1, 2, 3, 4, 5

6. OfType<T>()

OfType<T>() 方法筛选集合中指定类型的元素。以下是一个示例:

csharp
var objects = new List<object> { 1, "two", 3, "four", 5 };
var numbers = objects.OfType<int>();

Console.WriteLine(string.Join(", ", numbers)); // 输出: 1, 3, 5

实际案例

假设您有一个学生列表,您需要将这些学生按照成绩分组,并将每个组的学生姓名转换为大写。以下是如何使用 LINQ 转换操作符实现这一需求的示例:

csharp
var students = new List<Student>
{
new Student { Id = 1, Name = "Alice", Grade = "A" },
new Student { Id = 2, Name = "Bob", Grade = "B" },
new Student { Id = 3, Name = "Charlie", Grade = "A" }
};

var result = students
.GroupBy(s => s.Grade)
.ToDictionary(
g => g.Key,
g => g.Select(s => s.Name.ToUpper()).ToList()
);

foreach (var kvp in result)
{
Console.WriteLine($"Grade: {kvp.Key}");
Console.WriteLine($" Students: {string.Join(", ", kvp.Value)}");
}
// 输出:
// Grade: A
// Students: ALICE, CHARLIE
// Grade: B
// Students: BOB

总结

通过本文,您已经了解了 C# LINQ 中的转换操作符及其用法。这些操作符可以帮助您轻松地将数据从一种形式转换为另一种形式,从而简化数据处理任务。

提示

在实际开发中,LINQ 转换操作符非常有用,尤其是在处理复杂数据结构时。建议您多加练习,以熟练掌握这些操作符。

附加资源

练习

  1. 创建一个包含不同类型元素的集合(例如 intstring),并使用 OfType<T>() 方法筛选出所有整数。
  2. 使用 ToDictionary() 方法将一个学生列表转换为以学生 ID 为键的字典。
  3. 使用 ToLookup() 方法将一个学生列表按照成绩分组,并输出每个组的学生姓名。

通过完成这些练习,您将更好地理解 LINQ 转换操作符的用法。