Concat源码解析C#

在Dotnet开发过程中,Concat作为IEnumerable的扩展方法,十分常用。本文对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;
            }
        }
        
using System.Collections.Generic;
using System.Linq;
using System;

public class Demo {
   public static void Main() {

      //两个列表
      var list1 = new List<int>{12, 40};
      var list2 = new List<int>{98, 122, 199, 230};
   
      //concat-
      var res = list1.Concat(list2);

      foreach(int i in res) {
         Console.WriteLine(i);
      }
   }
}        


String.Concat字符串连接函数

String.Concat (Object)

 创建指定对象的 String 表示形式。
 


String.Concat (Object[])

 连接指定 Object 数组中的元素的 String 表示形式。
 


String.Concat (String[])

 连接指定的 String 数组的元素。
 


String.Concat (Object, Object)

连接两个指定对象的 String 表示形式。


String.Concat (String, String)

 连接 String 的两个指定实例。


String.Concat (Object, Object, Object)

连接三个指定对象的 String 表示形式。 

String.Concat (String, String, String)

 连接 String 的三个指定实例。 

String.Concat (Object, Object, Object, Object)

将四个指定对象的 String 表示形式与可选变量长度参数列表中指定的任何对象串联起来。


String.Concat (String, String, String, String)

连接 String 的四个指定实例。 由 .NET Compact Framework 支持。


该文章知识作为个人笔记,大部分知识来源于书本或网络整理总结;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HappyGirl快乐女孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值