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 转换操作符非常有用,尤其是在处理复杂数据结构时。建议您多加练习,以熟练掌握这些操作符。
附加资源
练习
- 创建一个包含不同类型元素的集合(例如
int
和string
),并使用OfType<T>()
方法筛选出所有整数。 - 使用
ToDictionary()
方法将一个学生列表转换为以学生 ID 为键的字典。 - 使用
ToLookup()
方法将一个学生列表按照成绩分组,并输出每个组的学生姓名。
通过完成这些练习,您将更好地理解 LINQ 转换操作符的用法。