[英]When to use Cast() and Oftype() in Linq
我知道兩種從 Linq 中的Arraylist
將類型轉換為IEnumerable
的方法,並且想知道在哪些情況下使用它們?
例如
IEnumerable<string> someCollection = arrayList.OfType<string>()
或者
IEnumerable<string> someCollection = arrayList.Cast<string>()
這兩種方法有什么區別,我應該在哪里應用每種情況?
OfType
- 僅返回可以安全地轉換為類型 x 的元素。
Cast
- 將嘗試將所有元素轉換為類型 x。 如果其中一些不是這種類型,您將得到InvalidCastException
編輯
例如:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
來源:LINQ 提示:Enumerable.OfType - Solutionizing .NET
從根本上說, Cast<T>()
是這樣實現的:
public IEnumerable<T> Cast<T>(this IEnumerable source)
{
foreach(object o in source)
yield return (T) o;
}
使用顯式強制轉換效果很好,但如果強制轉換失敗將導致InvalidCastException
。 這個想法的一個效率較低但有用的變體是OfType<T>()
:
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
foreach(object o in source)
if(o is T t)
yield return t;
}
返回的枚舉將僅包括可以安全地轉換為指定類型的元素。
如果您知道所有項目都是string
,則應該調用Cast<string>()
。
如果其中一些不是字符串,你會得到一個例外。
如果您知道某些項目不是string
並且您不想要這些項目,則應該調用OfType<string>()
。
如果其中一些不是字符串,它們將不會出現在新的IEnumerable<string>
中。
應該注意的是Cast(Of T)
可以在IEnumerable
上使用,這與其他 LINQ 函數不同,因此如果您需要在非泛型集合或列表(例如ArrayList
)上使用 LINQ,您可以使用Cast(Of T)
強制轉換為 LINQ 可以工作的IEnumerable(Of T)
。
Cast()
將嘗試強制轉換集合中的所有元素(如果元素類型錯誤,則會拋出異常),而OfType()
將僅返回正確類型的元素。
OfType
將過濾元素以僅返回指定類型的元素。 如果無法將元素轉換為目標類型,則Cast
將崩潰。
Cast<T>
將嘗試將所有項目轉換為給定類型T
。 此轉換可能會失敗或引發異常。 OfType<T>
將返回原始集合的子集並僅返回T
類型的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.