4
我經常發現自己寫這樣的代碼:的Linq:方法返回第一個實例與給定類型
collection.First(s => s is MyType) as MyType;
是否有一個更具體的LINQ的方法,它返回一個特定類型的第一個元素?
這樣的:
collection.FirstOfType<MyType>();
我也看了喬恩長柄水杓MoreLinq項目,但沒有運氣
我經常發現自己寫這樣的代碼:的Linq:方法返回第一個實例與給定類型
collection.First(s => s is MyType) as MyType;
是否有一個更具體的LINQ的方法,它返回一個特定類型的第一個元素?
這樣的:
collection.FirstOfType<MyType>();
我也看了喬恩長柄水杓MoreLinq項目,但沒有運氣
使用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;
}
}
謝謝,我知道'OfType',但沒有用於這種情況。你的建議顯然比我有的更好。我拿它沒有具體的方法,所以謝謝! – thumbmunkeys
'FirstOfType'並沒有真正太大的意義對我來說,爲'OfType'是一個過濾器的方法和'First'是Range方法。將每種過濾方法與Range方法結合使用會產生大量的擴展方法,其中'OfType().First()'幾乎相同,並且在兩者之間有明確的意圖分離。 –
jessehouwing
@jessehouwing我明白,我仍然經常使用這種功能,至少對我來說是有道理的。與我們說的不一樣,我們不需要'First',因爲你可以寫'Where(...)。First()'? – thumbmunkeys
所以你仍然可以這樣做,就像你已經顯示'.First(o => o是Type)'。幾乎所有的Range方法都有一個默認的過濾器方便**過載**,這對我來說不同於所有過濾器和所有範圍方法之間的交叉連接。如果經常使用'First',其他人將使用'Take'和'Last'或'Skip',並且最終得到'FirstOfType','LastOfType','TakeOfType','SkipOfType'和'FirstCast', 'LastCast'和'TakeCast'和'SkipCast'。這將變得非常混亂。 – jessehouwing