C# OfType(IEnumerable)的

2020-10-30  本文已影响0人  wwmin_

OfType的定义:IEnumerable.OfType(TResult),如其定义,其中TRsult为所要过滤的类型。由于非泛型集合一律以Object类型存储对象,因此一个非泛型集合可能存储了各种类型,而OfType()方法可以轻松的对指定的类型进行过滤筛选。

  1. 简单使用
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
  1. 枚举类型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 扩展了类型 IEnumerableOfType 只能应用于基于参数化类型的集合,而不能应用于 IEnumerable<T> 基于非参数化类型的集合 IEnumerable

通过 OfType 将应用到实现的集合 IEnumerable ,可以通过使用标准查询运算符来查询集合。 例如,指定的类型参数 Object OfType 将返回 IEnumerable<Object> c # 或 Visual Basic 中类型的对象 IEnumerable(Of Object) ,标准查询运算符可以应用于该对象。

注: 本人c#代码中部分使用了LinqPad工具, Dump为该工具打印输出的语法,类似Console.WriteLine, 特此说明.

上一篇 下一篇

猜你喜欢

热点阅读