簡體   English   中英

何時在 Linq 中使用 Cast() 和 Oftype()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM