美文网首页
C# OfType(IEnumerable)的

C# OfType(IEnumerable)的

作者: wwmin_ | 来源:发表于2020-10-30 14:55 被阅读0次

    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, 特此说明.

    相关文章

      网友评论

          本文标题:C# OfType(IEnumerable)的

          本文链接:https://www.haomeiwen.com/subject/ouldvktx.html