C#-Linq源码解析之Concat
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#-Linq源码解析之Concat相关的知识,希望对你有一定的参考价值。
前言
在Dotnet开发过程中,Concat作为IEnumerable的扩展方法,十分常用。本文对Concat方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。
使用
Concat 连接两个序列。
假如我们有这样的两个集合,我们需要把两个集合进行连接!
List<string> lst = new List<string> "张三", "李四" ;
List<string> lst2 = new List<string> "王麻子" ;
不使用Linq
大概会这样写!
private List<string> Concat(List<string> first, List<string> second)
if (first == null)
throw new Exception("first is null");
if (second == null)
throw new Exception("second is null");
List<string> lstAll = new List<string>();
foreach (var item in first)
lstAll.Add(item);
foreach (var item in second)
lstAll.Add(item);
return lstAll;
使用Linq
lst.Concat(lst2);
源码解析
方法
public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
参数
first 要连接的第一个序列。
second 要连接的第二个序列。
返回值
IEnumerable< TSource > 一个包含两个输入序列的连接元素的 IEnumerable< T>。
此方法通过使用延迟执行来实现,因为IEnumerable是延迟加载的,每次访问的时候才取值。所以我们在返回数据时需要使用yield
所以我们可通过使用 foreach 语句从迭代器方法返回的序列。foreach 循环的每次迭代都会调用迭代器方法。迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。下次调用迭代器函数时,将从该位置重新开始执行。
源码:
public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
if (first == null)
throw new Exception("first is null");
if (second == null)
throw new Exception("second is null");
foreach (TSource item in first)
yield return item;
foreach (TSource item2 in second)
yield return item2;
总结
本次通过分析Concat代码,进一步了解了迭代器与yield。
以上是关于C#-Linq源码解析之Concat的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to SQL语句之Concat/Union/Intersect/Except