LINQ 转换业务
假设你有类似以下的类型:
interface IThing { }
class Thing : IThing { }
LINQ 允许你创建一个投影,通过 Enumerable.Cast<>()
和 Enumerable.OfType<>()
扩展方法更改 IEnumerable<>
的编译时泛型类型。
IEnumerable<IThing> things = new IThing[] {new Thing()};
IEnumerable<Thing> things2 = things.Cast<Thing>();
IEnumerable<Thing> things3 = things.OfType<Thing>();
当评估 things2
时,Cast<>()
方法将尝试将 things
中的所有值转换为 Thing
s。如果遇到无法投射的值,则会抛出 InvalidCastException
。
当评估 things3
时,OfType<>()
方法将执行相同的操作,除非遇到无法转换的值,它将简单地省略该值而不是抛出异常。
由于这些方法的泛型类型,它们无法调用转换运算符或执行数字转换。
double[] doubles = new[]{1,2,3}.Cast<double>().ToArray(); // Throws InvalidCastException
你可以简单地在 .Select()
中执行转换作为解决方法:
double[] doubles = new[]{1,2,3}.Select(i => (double)i).ToArray();