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();