OfType的定义:IEnumerable.OfType(TResult),如其定义,其中TRsult为所要过滤的类型。由于非泛型集合一律以Object类型存储对象,因此一个非泛型集合可能存储了各种类型,而OfType()方法可以轻松的对指定的类型进行过滤筛选。
- 简单使用
string[] ss = new string[]{"111","222","333"};
var sList = ss.OfType<string>().ToList().Dump(); //111 222 333
object[] oo = new object[]{1,2,3,"4","5","6",11.1,22.2};
oo.OfType<int>().ToList().Dump(); //1 2 3
oo.OfType<string>().ToList().Dump(); // 4 5 6
oo.OfType<double>().ToList().Dump(); //11.1 22.2
- 枚举类型Enum结合OfType<TResult>转为List的使用
using System.Linq;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
[Flags]
public enum Permission
{
create = 1,
read = 2,
update = 4,
delete = 8
}
var arr = Enum.GetValues(typeof(Permission));
//使用for循环将Array转为List
var aList = new List<int>(arr.Length);
for (int i = 0; i < arr.Length; i++)
{
aList.Add((int)arr.GetValue(i)!);
}
aList.Dump("aList"); //1 2 4 8
//使用OfType<TResult> 将其转换为指定类型的List
var bList = arr.OfType<Permission>().ToList();
bList.Select(p=>(int)p).Dump("bList");//1 2 4 8
官方解释:
此方法是使用延迟执行实现的。 即时返回值是一个对象,该对象存储执行操作所需的所有信息。 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator
方法,或者通过 foreach
在 Visual c # 中使用。
OfType<TResult>(IEnumerable)方法只返回中 source
可强制转换为类型的元素 TResult
。 若要改为在元素无法强制转换为类型时接收异常 TResult
,请使用 Cast<TResult>(IEnumerable) 。
此方法是一些标准查询运算符方法,可应用于具有非参数化类型的集合,例如 ArrayList 。 这是因为 OfType 扩展了类型 IEnumerable 。 OfType 只能应用于基于参数化类型的集合,而不能应用于 IEnumerable<T> 基于非参数化类型的集合 IEnumerable 。
通过 OfType 将应用到实现的集合 IEnumerable ,可以通过使用标准查询运算符来查询集合。 例如,指定的类型参数 Object OfType 将返回 IEnumerable<Object>
c # 或 Visual Basic 中类型的对象 IEnumerable(Of Object)
,标准查询运算符可以应用于该对象。
注: 本人c#
代码中部分使用了LinqPad工具, Dump
为该工具打印输出的语法,类似Console.WriteLine
, 特此说明.
网友评论