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