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 中的所有值转换为 Things。如果遇到无法投射的值,则会抛出 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();