使用LINQ和C#在元素列表中查找第一个特定类型的项的最短表示法是什么?
dtcbnfnu1#
var first = yourCollection.OfType<YourType>().First();
请注意,如果没有YourType类型的元素,First方法将抛出异常。如果您不希望这样,则可以使用FirstOrDefault或Take(1)来代替,这取决于您希望的行为。
YourType
First
FirstOrDefault
Take(1)
i86rm4rw2#
使用OfType扩展方法:
public static T FindFirstOfType<T>(IEnumerable list){ return list.OfType<T>().FirstOrDefault(); }
fjaof16o3#
您需要Enumerable.OfType:
Enumerable.OfType
list.OfType<MyType>().First();
fhg3lkii4#
您可以只使用FirstOrDefault,并传入委派以用于比较。
object[] list = new object[] { 4, "something", 3, false, "other" }; string first = list.FirstOrDefault(o => o is string); //something
ars1skjm5#
我推荐hugoware的答案,以避免不必要的迭代:
(string)source.FirstOrDefault(f => f is string)
但是如果您担心微优化,您可以创建自己的扩展方法:
public static class ListExtensions { public static T FirstOrDefault<T>(this IList source) { for (int i = 0; i < source.Count; i++) { if (source[i] is T) return (T)source[i]; } return default; } }
基准测试使用100个对象列表,其中只有最后一个是字符串(dotnet 7、BenchmarkDotNet):第一次
5条答案
按热度按时间dtcbnfnu1#
请注意,如果没有
YourType
类型的元素,First
方法将抛出异常。如果您不希望这样,则可以使用FirstOrDefault
或Take(1)
来代替,这取决于您希望的行为。i86rm4rw2#
使用OfType扩展方法:
fjaof16o3#
您需要
Enumerable.OfType
:fhg3lkii4#
您可以只使用
FirstOrDefault
,并传入委派以用于比较。ars1skjm5#
我推荐hugoware的答案,以避免不必要的迭代:
但是如果您担心微优化,您可以创建自己的扩展方法:
基准测试使用100个对象列表,其中只有最后一个是字符串(dotnet 7、BenchmarkDotNet):
第一次