这些转换操作符将集合转换成数组:IEnumerable、IList、IDictionary等。转换操作符是用来实现将输入对象的类型转变为序列的功能。名称以"As"开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合。名称以"To"开头的方法可枚举(即时加载)源集合并将项放入相应的集合类型。

一、AsEnumerable操作符

所有实现了IEnumerable<T>接口的类型都可以调用此方法来获取一个IEnumerable<T>集合。AsEnumerable操作符可以将一个类型为IEnumerable<T>的输入序列转换成一个IEnumerable<T>的输出序列,其主要用于将一个实现了IEnumerable<T>接口的对象转换成一个标准的IEnumerable<T>接口对象。在Linq中,不同领域的Linq实现都有自己专属的操作符。

例如:IQueryable<T>通常是Linq to SQL的返回类型,当我们之间在上面调用Where<>方法时,调用的是Linq to SQL的扩展方法,因此有时候我们需要转换为标准的IEnumerable<T>,然后在调用Linq to OBJECT的扩展方法。来看方法的定义:

 public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)

看看下面的例子:

 DataTable dt = new DataTable();
// 将dt先使用AsEnumerable()操作符进行转换,然后在调用Linq to Object 的where方法
var list= dt.AsEnumerable().Where(p => p.Name.length > );

二、ToArray操作符

ToArray操作符可以在IEnumerable<T>类型的任何派生对象上调用,返回值为T类型的数组。其方法定义如下:

 public T[] ToArray();

看下面的例子:

 List<int> list = new List<int>();
list.Add();
list.Add();
list.Add();
// 将List<int>类型的集合转换成int[]数组
int[] intArray = list.ToArray();

三、ToDictionary操作符

ToDictionary操作符根据指定的键选择器函数,从IEnumerable<T>创建一个Dictionary<TKey,TValue>。

开看下面的例子。

先定义Category类:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConvertOperation
{
public class Category
{
public int Id { get; set; }
public string CategoryName { get; set; }
public DateTime CreateTime { get; set; }
}
}

调用:

 List<Category> listCategory = new List<Category>()
{
new Category(){ Id=,CategoryName="计算机",CreateTime=DateTime.Now.AddYears(-)},
new Category(){ Id=,CategoryName="文学",CreateTime=DateTime.Now.AddYears(-)},
new Category(){ Id=,CategoryName="高校教材",CreateTime=DateTime.Now.AddMonths(-)},
new Category(){ Id=,CategoryName="心理学",CreateTime=DateTime.Now.AddMonths(-)}
};
var dict= listCategory.ToDictionary(c => c.Id, c => c.CategoryName);
foreach(var item in dict)
{
Console.WriteLine($"key:{item.Key},value:{item.Value}");
}

结果:

注意:

1、如果省略ToDictionary()方法的第二个参数(值选择函数),那么value将会保存一个类别对象。看下面的例子:

 var dict = listCategory.ToDictionary(c=>c.Id);
foreach (var item in dict)
{
Console.WriteLine($"key:{item.Key},Id:{dict[item.Key].Id},CategoryName:{dict[item.Key].CategoryName},CreateTime:{dict[item.Key].CreateTime}");
}

在程序运行时打断点,查询value的类型:

从截图中可以看出:这时value的类型是Category类型。其输出结果如下:

2、如果key值为null或者出现重复的key,那么将会导致程序抛出异常。(字典的key值不可以是重复的)

四、ToList操作符

ToList操作符可以在IEnumerable<T>类型的任何派生对象上使用,返回值是List<T>类型的集合。其定义如下:

 public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);

来看下面的例子:

 int[] intArray = { , , , , ,  };
List<int> list = intArray.ToList();

五、ToLookUp操作符

ToLookUp操作符将创建一个LookUp<TKey,TElement>对象,这是一个one-to-many的集合,一个key可以对应多个value值。其方法定义如下:

 public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector);
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);

从方法定义中可以看出:ToLookUp的value值的类型和集合中元素的类型一致。如果一个key对应多个value值,那么value会是TSource类型的集合。

来看下面的例子。

先定义Product类,Product类中的分类ID可以对应多个产品,其定义如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConvertOperation
{
public class Product
{
public int Id { get; set; }
public int CategoryId { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public DateTime CreateTime { get; set; }
}
}

在方法中调用:

 List<Product> listProduct = new List<Product>()
{
new Product(){Id=,CategoryId=, Name="C#高级编程第10版", Price=100.67,CreateTime=DateTime.Now},
new Product(){Id=,CategoryId=, Name="Redis开发和运维", Price=69.9,CreateTime=DateTime.Now.AddDays(-)},
new Product(){Id=,CategoryId=, Name="活着", Price=,CreateTime=DateTime.Now.AddMonths(-)},
new Product(){Id=,CategoryId=, Name="高等数学", Price=,CreateTime=DateTime.Now.AddMonths(-)},
new Product(){Id=,CategoryId=, Name="国家宝藏", Price=52.8,CreateTime=DateTime.Now.AddMonths(-)}
};
var list = listProduct.ToLookup(p => p.CategoryId, p => p.Name);
foreach (var item in list)
{
Console.WriteLine($"key:{item.Key}");
foreach (var p in item)
{
Console.WriteLine($"value:{p}");
}
}

结果:

注意:

1、如果省略ToLookUp()方法的第二个参数(值选择函数),那么value将会保存一个类别对象。看下面的例子:

 var list1 = listProduct.ToLookup(p => p.CategoryId);
foreach (var item in list1)
{
Console.WriteLine($"key:{item.Key}");
foreach (var p in item)
{
Console.WriteLine($"Id:{p.Id},CategoryId:{p.CategoryId},Name:{p.Name},CreateTime:{p.CreateTime}");
}
}

程序运行时打断点,查看value值的类型:

从上面的截图中能够看出:这时value的类型是Product类型。运行结果如下:

2、ToLookUp和GroupBy操作很相似,只不过GroupBy是延迟加载的,ToLookUp是立即加载的。

六、Cast操作符

Cast操作符用于将一个类型为IEnumerable的集合对象转换为IEnumerable<T>类型的集合对象。也就是非泛型集合转成泛型集合,因为在Linq to OBJECT中,绝大部分操作符都是针对IEnumerable<T>类型进行的扩展方法。因此对非泛型集合并不适用。来看方法定义:

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

来看下面的例子:

 ArrayList arrayList = new ArrayList();
arrayList.Add();
arrayList.Add();
arrayList.Add();
//非泛型转换成泛型
var list = arrayList.Cast<int>();
foreach (var item in list)
{
Console.WriteLine(item);
}

结果:

注意:

1、使用Cast()方法时必须要传入类型参数。

2、序列中的元素必须要能转换为类型 TResult。看下面的例子:

 ArrayList arrayList = new ArrayList();
arrayList.Add();
arrayList.Add("");
arrayList.Add();
//非泛型转换成泛型
var list = arrayList.Cast<int>();
foreach (var item in list)
{
Console.WriteLine(item);
}

程序运行结果:

linq操作符:转换操作符的更多相关文章

  1. Linq 标准查询操作符三

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  2. LINQ 标准查询操作符

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  3. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

  4. LINQ标准查询操作符详解(转)

     一. 关于LINQ       LINQ 英文全称是“Language-Integrated Query”,中文为“语言集成查询”,它是微软首席架构师.Delphi 之父和C# 之父——Anders ...

  5. Linq标准查询操作符

     Linq的出现让代码简洁了不少.之前在项目中基本都在使用它,但是没有完整的整理过,今天借这个周末,将其进行整理,方便后期对其的使用.Linq的操作可以分为聚合,连接,转换,元素操作符,相等操作,生成 ...

  6. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  7. Linq学习之操作符

    一.环境搭建 下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境.所以请大家务必按照 搭建这里的环境否则会影响你后面的学习. 我们用到的几张表 通知消息表: 用 ...

  8. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  9. LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

    七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...

随机推荐

  1. django -- 多对多关系的实现

    在django中表和表之间的多对多关系有两种实现方案: 方案一:直接使用django自动实现的多对多关系. 方案二:自己写连接表.然而告诉django在实现多对多关系时要使用的连接表. 一.方案一: ...

  2. c#中lock的使用(用于预约超出限额的流程)

    一个项目,预约系统,核心二张表:预约表,预约限额表 用户点击预约按钮后, 1. 先select 预约限额表把该预约时间段的限额取出来, 2. 再select 预约表把该预约时间已经预约上的次数算出来 ...

  3. [svc]tomcat目录结构/虚拟主机/nginx反向代理cache配置

    tomcat目录文件 /usr/local/tomcat/bin/catalina.sh stop sleep 3 /usr/local/tomcat/bin/catalina.sh start to ...

  4. 【Unity】11.8 关节

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Unity提供了下面的关节组件:铰链关节(Hinge Joint).固定关节(Fixed Joint).弹簧关节(Spr ...

  5. Redis高可用架构—Keepalive+VIP

    最近整理一下Redis高可用架构的文档,也准备分享出来,虽然这些架构也不是很复杂.Redis的高可用方案目前主要尝试过5种方式,其中2种方式已经在线上使用. 1)Redis Master-Slave ...

  6. Market Guide for AIOps Platforms

    AIOps platforms enhance IT operations through greater insights by combining big data, machine learni ...

  7. update set where exists 多表更新 在mssql、MySQL、Oracle中分别用法

    MySQL: UPDATE ChgCfm t1 INNER JOIN tb_dz_file t2 ON t1.ID = t2.ID ' SQLserver: FROM ChgCfmRcd t1 ' F ...

  8. pandas数组和numpy数组在使用索引数组过滤数组时的区别

    numpy array 过滤后的数组,索引值从 0 开始. pandas Series 过滤后的 Series ,保持原来的索引,原来索引是几,就是几. 什么意思呢,来看个栗子: import num ...

  9. C++对象模型-构造函数语意学

    关于C++,最常听到的一个抱怨就是:编译器背着程序员干了太多的事情. default constructor函数的构建 default constructors会在需要的时候被编译器创建出来,关键字是 ...

  10. Web服务器缓存

    前面提到的一些缓存技术都是有我们的动态才程序控制的,现在的web服务器功能越来越强大,常用的web服务器软件也都内置了缓存功能,下面我们就简单的说下服务器端缓存的应用. 首先,我们先来介绍一下URL映 ...