在本文中,我们展示了如何使用LINQ的OfType方法按类型过滤可枚举的元素。
语言集成查询(LINQ)是一种特定领域的语言,用于从各种数据源(包括数组、列表、XML文件或数据库)查询数据。
public static IEnumerable<TResult> OfType<TResult> (this IEnumerable source);
OfType
方法根据指定类型过滤IEnumerable
的元素。TResult
是用于过滤序列元素的类型。source
是要过滤其元素的序列。
C#LINQOfType示例
下面是一个使用LINQ的OfType
方法的简单示例。
object[] vals = new object[] { "falcon", 12, "sky", "new", "34", 11 }; var res = vals.OfType<int>(); foreach(var e in res) { Console.WriteLine(e); } Console.WriteLine("-----------------------"); var res2 = vals.OfType<string>(); foreach(var e in res2) { Console.WriteLine(e); }
我们定义了一个对象数组。在数组中,我们有字符串和整数。在OfType
方法的帮助下,我们分别提取整数和字符串。
var res = vals.OfType<int>(); foreach(var e in res) { Console.WriteLine(e); }
这里我们从数组中过滤所有整数。类型在尖括号之间指定。
$ dotnet run 12 11 ----------------------- falcon sky new 34
C#LINQOfType示例二
在下一个示例中,我们使用记录类型。
List<Person> persons = new List<Person> { new User("John Doe"), new Admin("Roger Roe"), new User("Peter Smith"), new User("Peter Novotny") }; var res = from person in persons.OfType<Admin>() select person; Console.WriteLine(string.Join(",", res)); Console.WriteLine("---------------------------"); var res2 = from person in persons.OfType<User>() select person; Console.WriteLine(string.Join(",", res2)); interface Person { } record User(string Name) : Person; record Admin(string Name) : Person;
我们定义了Person
接口和两种记录类型:User
和Admin
。使用LINQ查询表达式,我们将管理员和用户从人员列表中分离出来。
$ dotnet run Admin { Name = Roger Roe } --------------------------- User { Name = John Doe },User { Name = Peter Smith },User { Name = Peter Novotny }
C#LINQ转换
还有一个类似的Cast
方法。该方法将IEnumerable
的元素转换为指定的类型。与OfType
不同,如果序列中的元素无法转换为给定类型,则Cast
方法会抛出InvalidCastException
。
object[] vals = new object[] { "falcon", 12, "sky", "new", "34", 11 }; var res = vals.Cast<string>(); foreach(var e in res) { Console.WriteLine(e); }
我们对对象数组使用Cast
方法。
$ dotnet run falcon Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'. ...
在本文中,我们介绍了LINQOfType
方法。
列出所有C#教程。