在本文中,我们展示了如何使用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#教程。
