C#中LINQ的Cast<T>与OfType<T>
在C#中,Cast() 方法是LINQ(Language Integrated Query)的一部分,它位于 System.Linq 命名空间中。这个方法用于将 IEnumerable 集合(或任何实现了 IEnumerable 接口的集合)的元素转换为指定类型 T 的集合。这个过程实际上是尝试将每个元素视为类型 T,如果转换失败(比如,如果某个元素无法被强制转换为 T),则会抛出一个 InvalidCastException。
使用场景
当你有一个对象集合,并希望以强类型的方式处理这些对象时,Cast() 方法非常有用。这在你不能确定集合中所有元素都是特定类型但又需要按该类型处理它们时尤其有用。
示例
假设我们有一个 List,其中包含了一些字符串和整数,但我们只对字符串感兴趣。我们可以使用 Cast() 来尝试将集合转换为字符串集合,但需要注意,如果集合中包含非字符串元素,这将导致运行时错误。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<object> objects = new List<object> { "Hello", 123, "World" };
try
{
// 尝试将 List<object> 转换为 List<string>
var strings = objects.Cast<string>().ToList();
// 这里不会执行,因为 Cast<string>() 会抛出 InvalidCastException
// 因为它试图将整数 123 转换为 string
foreach (var str in strings)
{
Console.WriteLine(str);
}
}
catch (InvalidCastException ex)
{
Console.WriteLine("无法将所有对象转换为字符串: " + ex.Message);
}
// 正确的做法是使用 OfType<T>(),它只会返回可以成功转换为 T 的元素
var safeStrings = objects.OfType<string>().ToList();
foreach (var str in safeStrings)
{
Console.WriteLine(str);
}
}
}
在上面的示例中,尝试使用 Cast() 会导致 InvalidCastException,因为集合 objects 包含了一个整数,该整数无法转换为字符串。为了避免这种情况,我们可以使用 OfType() 方法,它只会返回那些可以成功转换为指定类型 T 的元素,而忽略那些不能转换的元素。
结论
Cast() 尝试将 IEnumerable 集合中的每个元素转换为类型 T。
如果任何元素无法转换为 T,则会抛出 InvalidCastException。
使用 Cast() 时要小心,确保集合中的所有元素都可以安全地转换为 T。
如果需要处理可能包含不同类型元素的集合,并只想获取那些可以转换为特定类型的元素,考虑使用 OfType() 方法。