ZetCode

C# LINQ OfType

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何使用 LINQ 的 OfType 方法通过类型筛选枚举中的元素。

语言集成查询 (LINQ) 是一种特定领域的语言,用于查询来自各种数据源的数据,包括数组、列表、XML 文件或数据库。

public static IEnumerable<TResult> OfType<TResult> (this IEnumerable source);

OfType 方法根据指定的类型筛选 IEnumerable 的元素。TResult 是要筛选序列元素的类型。source 是要筛选其元素的序列。

C# LINQ OfType 示例

以下是一个使用 LINQ 的 OfType 方法的简单示例。

Program.cs
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# LINQ OfType 示例 II

在下一个示例中,我们将使用记录类型。

Program.cs
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 接口和两种记录类型:UserAdmin。使用 LINQ 查询表达式,我们从人员列表中分离出管理员和用户。

$ dotnet run
Admin { Name = Roger Roe }
---------------------------
User { Name = John Doe },User { Name = Peter Smith },User { Name = Peter Novotny }

C# LINQ Cast

还有一个类似的 Cast 方法。该方法将 IEnumerable 的元素强制转换为指定的类型。与 OfType 不同,如果序列中的元素无法强制转换为给定的类型,则 Cast 方法会抛出 InvalidCastException

Program.cs
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'.
...

来源

Enumerable.OfType 方法

在本文中,我们介绍了 LINQ 的 OfType 方法。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 C# 教程