2014-03-13 85 views
4

我經常發現自己寫這樣的代碼:的Linq:方法返回第一個實例與給定類型

collection.First(s => s is MyType) as MyType; 

是否有一個更具體的LINQ的方法,它返回一個特定類型的第一個元素?

這樣的:

collection.FirstOfType<MyType>(); 

我也看了喬恩長柄水杓MoreLinq項目,但沒有運氣

+1

'FirstOfType'並沒有真正太大的意義對我來說,爲'OfType'是一個過濾器的方法和'First'是Range方法。將每種過濾方法與Range方法結合使用會產生大量的擴展方法,其中'OfType ().First()'幾乎相同,並且在兩者之間有明確的意圖分離。 – jessehouwing

+0

@jessehouwing我明白,我仍然經常使用這種功能,至少對我來說是有道理的。與我們說的不一樣,我們不需要'First',因爲你可以寫'Where(...)。First()'? – thumbmunkeys

+1

所以你仍然可以這樣做,就像你已經顯示'.First(o => o是Type)'。幾乎所有的Range方法都有一個默認的過濾器方便**過載**,這對我來說不同於所有過濾器和所有範圍方法之間的交叉連接。如果經常使用'First',其他人將使用'Take'和'Last'或'Skip',並且最終得到'FirstOfType','LastOfType','TakeOfType','SkipOfType'和'FirstCast', 'LastCast'和'TakeCast'和'SkipCast'。這將變得非常混亂。 – jessehouwing

回答

12

使用Enumerable.OfType<T>通過指定類型過濾收集:

collection.OfType<MyType>().First(); 

注 - 如果有有可能在收集中不存在MyType的項目,則使用FirstOrDefault()以避免異常。

內部OfType只是使用is運算符來產生所有與給定類型兼容的項目。像這樣的東西(其實OfType回報OfTypeIterator其迭代集合):

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) 
{ 
    foreach (object obj in source) 
    { 
     if (!(obj is TResult)) 
      continue; 

     yield return (TResult)obj; 
    } 
} 
+1

謝謝,我知道'OfType',但沒有用於這種情況。你的建議顯然比我有的更好。我拿它沒有具體的方法,所以謝謝! – thumbmunkeys

相關問題