国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# Linq源碼分析之Take方法

這篇具有很好參考價(jià)值的文章主要介紹了C# Linq源碼分析之Take方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

概要

Take方法作為IEnumerable的擴(kuò)展方法,具體對(duì)應(yīng)兩個(gè)重載方法。本文主要分析第一個(gè)接收整數(shù)參數(shù)的重載方法。

源碼解析

Take方法的基本定義

public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source, int count);

基本功能是從序列source中,返回指定個(gè)數(shù)count的相鄰元素。

源碼分析

Take.cs

public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count)
{
   if (source == null)
   {
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
   }

   return count <= 0 ?
       Empty<TSource>() :
       TakeIterator<TSource>(source, count);
}

Take方法本身代碼很簡(jiǎn)單, 首先作了一個(gè)空序列的檢查,如果序列為空,則拋出異常。然后如果count是0,即取前0項(xiàng)相鄰元素,等價(jià)于什么也不作,直接返回,否則調(diào)用TakeIterator方法。

Take.SizeOpt.cs

private static IEnumerable<TSource> TakeIterator<TSource>(IEnumerable<TSource> source, int count)
{
    Debug.Assert(count > 0);

    foreach (TSource element in source)
    {
        yield return element;
        if (--count == 0) break;
    }
}

TakeIterator方法并沒(méi)有像我們之前分析的Where,Select等方法那樣,根據(jù)功能,定于很多Iterator的派生類(lèi)來(lái)實(shí)現(xiàn)具體的功能,而是使用了yield return的方式。

按照count的個(gè)數(shù)取出對(duì)應(yīng)的元素,以yield return的方式返回。

下面我們使用相同的代碼,定義我們自己的擴(kuò)展方法take 和takeIterator,通過(guò)log來(lái)搞清楚yield return方式的實(shí)現(xiàn)細(xì)節(jié)。

 public static IEnumerable<TSource> take<TSource>(this IEnumerable<TSource> source, int count)
{
    Console.WriteLine("take is called !");
    if (source == null)
    {             ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }
    return count <= 0 ?
        Empty<TSource>() :
        takeIterator<TSource>(source, count);
}

private static IEnumerable<TSource> takeIterator<TSource>(IEnumerable<TSource> source, int count)
{
    Console.WriteLine("TakeIterator is called !");
    Debug.Assert(count > 0);

    foreach (TSource element in source)
    {
        Console.WriteLine("Enter takeIterator Foreach");
        yield return element;
        Console.WriteLine("Return " + element + " from takeIterator Foreach");
        if (--count == 0) break;
    }
}

Case 1 不通過(guò)toList或foreach循環(huán)來(lái)調(diào)用take的返回值。

  static void Main(string[] args)
  {
   	 var list = Enumerable.Range(1,10).take(2);
  }

執(zhí)行結(jié)果如下:

C# Linq源碼分析之Take方法,.Net,.Net Core,C#基礎(chǔ),c#,linq,開(kāi)發(fā)語(yǔ)言
我們可以看到takeIterator并未被調(diào)用。

Case 2: 通過(guò)foreach循環(huán)來(lái)調(diào)用take的返回值

static void Main(string[] args)
  {
   	 var list = Enumerable.Range(1,10).take(2);
   	 foreach (var item in list)
      {
          Console.WriteLine("Enter foreach Main function's  foreach");
          Console.WriteLine("Print " + item + " in Main function");
      }
  }

執(zhí)行結(jié)果如下:

C# Linq源碼分析之Take方法,.Net,.Net Core,C#基礎(chǔ),c#,linq,開(kāi)發(fā)語(yǔ)言
從執(zhí)行結(jié)果可以看出:

  1. takeIterator函數(shù)只執(zhí)行一次,但是會(huì)生成一個(gè)狀態(tài)機(jī),用于返回take出來(lái)的所有數(shù)據(jù);
  2. Main函數(shù)中的foreach每次的取值,是從狀態(tài)機(jī)中獲取數(shù)據(jù),即通過(guò)yield return的方式獲取。

結(jié)論

通過(guò)定義具體迭代器實(shí)現(xiàn)的延遲加載和通過(guò)yield return方式實(shí)現(xiàn)的延遲加載,本質(zhì)上沒(méi)有區(qū)別。

但是實(shí)現(xiàn)上略有不同,定義迭代器方式實(shí)現(xiàn)的Where或Select等方法,如果沒(méi)有取值操作,它只是將迭代器對(duì)象返回,迭代器對(duì)象中保存了迭代方式和源數(shù)據(jù)序列,對(duì)應(yīng)的方法會(huì)被調(diào)用。通過(guò)yield return方式實(shí)現(xiàn)的迭代器,如果沒(méi)有取值操作,yield return所在的方法不會(huì)被調(diào)用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-641624.html

到了這里,關(guān)于C# Linq源碼分析之Take方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C# 基礎(chǔ)精講】LINQ 基礎(chǔ)

    【C# 基礎(chǔ)精講】LINQ 基礎(chǔ)

    LINQ(Language Integrated Query)是一項(xiàng)強(qiáng)大的C#語(yǔ)言特性,它使數(shù)據(jù)查詢(xún)和操作變得更加簡(jiǎn)潔、靈活和可讀性強(qiáng)。通過(guò)使用LINQ,您可以使用類(lèi)似SQL的語(yǔ)法來(lái)查詢(xún)各種數(shù)據(jù)源,如集合、數(shù)組、數(shù)據(jù)庫(kù)等。本文將介紹LINQ的基礎(chǔ)概念、常見(jiàn)的LINQ操作和示例,以及如何在C#中利用LINQ進(jìn)行數(shù)

    2024年02月12日
    瀏覽(22)
  • C#基礎(chǔ)--Lambda和LINQ

    C#基礎(chǔ)--Lambda和LINQ

    在.NetFramewok的不同版本都有不同的樣子;在.NetCore下也都是支持的; 1.1 .Netframework1.0/1.1時(shí)代 1.2 .NetFramework2.0 匿名方法 增加了一個(gè)delegate, 可以訪(fǎng)問(wèn)到除了參數(shù)以外的局部變量 1.3 .NetFramework3.0 前期 去掉了delegate,添加了一個(gè)= goes to 1.4 .NetFramework3.0 后期 去掉了匿名

    2024年02月17日
    瀏覽(20)
  • C#基礎(chǔ):利用LINQ進(jìn)行復(fù)雜排序

    請(qǐng)你寫(xiě)出linq對(duì)表格排序, CODE=3排前面 ,其余按照 CODE降序 排序,CODE一樣再按照 字母升序 排序 ID CODE VALUE A0001 1 A A0002 1 B A0003 1 C A0004 2 D A0005 2 E A0006 2 F A0007 3 G A0008 3 H A0009 3 I A0010 4 J 若再加大難度,ID=A0005的排第一,然后CODE=3排前面,其余按照CODE降序排序,再按照字母升序排

    2024年01月18日
    瀏覽(18)
  • 【C# 基礎(chǔ)精講】LINQ to XML查詢(xún)

    【C# 基礎(chǔ)精講】LINQ to XML查詢(xún)

    LINQ to XML 是 C# 中用于查詢(xún)和操作 XML 數(shù)據(jù)的強(qiáng)大工具。它允許您使用 LINQ 查詢(xún)語(yǔ)法對(duì) XML 文檔進(jìn)行查詢(xún)、過(guò)濾、投影等操作,從而更加方便地處理 XML 數(shù)據(jù)。本文將詳細(xì)介紹 LINQ to XML 的基本概念、常見(jiàn)操作以及示例,幫助您了解如何在 C# 中使用 LINQ to XML 進(jìn)行 XML 數(shù)據(jù)的查詢(xún)和

    2024年02月12日
    瀏覽(50)
  • 【C# 基礎(chǔ)精講】LINQ to Objects查詢(xún)

    【C# 基礎(chǔ)精講】LINQ to Objects查詢(xún)

    LINQ to Objects是LINQ技術(shù)在C#中的一種應(yīng)用,它專(zhuān)門(mén)用于對(duì)內(nèi)存中的對(duì)象集合進(jìn)行查詢(xún)和操作。通過(guò)使用LINQ to Objects,您可以使用統(tǒng)一的語(yǔ)法來(lái)查詢(xún)、過(guò)濾、排序、分組等操作各種.NET對(duì)象。本文將詳細(xì)介紹LINQ to Objects的基本概念、常見(jiàn)的操作和示例,以幫助您更好地理解如何在

    2024年02月11日
    瀏覽(18)
  • C# LINQ常用操作方法——提升你的編程效率

    C# LINQ常用操作方法——提升你的編程效率

    導(dǎo)語(yǔ):C# LINQ(Language Integrated Query)是一種強(qiáng)大且靈活的查詢(xún)語(yǔ)言,可以將數(shù)據(jù)查詢(xún)、過(guò)濾、排序和轉(zhuǎn)換等操作無(wú)縫集成到C#代碼中。本文將介紹一些常用的LINQ操作方法,幫助熟練掌握LINQ的使用,并進(jìn)一步提升編程效率。 對(duì)于初學(xué)者來(lái)說(shuō),基本的查詢(xún)操作是使用LINQ時(shí)的關(guān)鍵

    2024年02月06日
    瀏覽(54)
  • 【C#】【System.Linq】一些便捷的數(shù)據(jù)處理方法(Range、Select)

    因?yàn)橛昧?xí)慣了Python中一些便捷的方法,隨即查詢(xún)C#中有沒(méi)有類(lèi)似的。 ?一、Range()方法 在Python中,range(Start,End,Step)可以直接生成一個(gè)可迭代對(duì)象,便用于需要循環(huán)多次處理某些代碼塊: (注:Range方法中的End是開(kāi)區(qū)間,range(1,10)實(shí)際的取值是(1 ~ 9)) ? 在C#中也

    2024年02月08日
    瀏覽(20)
  • C# Linq 學(xué)會(huì)使用,學(xué)會(huì)自己編寫(xiě)Linq

    C# Linq 學(xué)會(huì)使用,學(xué)會(huì)自己編寫(xiě)Linq

    Linq我暫時(shí)理解為,一種內(nèi)置的非常方便的數(shù)據(jù)查詢(xún)的工具 我們先學(xué)習(xí)它的使用 //數(shù)據(jù)類(lèi) //新建了一個(gè)List數(shù)據(jù),用來(lái)測(cè)試數(shù)據(jù)查詢(xún)? //現(xiàn)在定義一個(gè)需求,需要查出 id2 的數(shù)據(jù) 引用Linq的命名空間 ?引用命名空間之后,我們的list對(duì)象,擁有了一個(gè)擴(kuò)展方法,Where (擴(kuò)展方法,在之前的博客

    2024年02月06日
    瀏覽(29)
  • EF.Core 使用Linq的Contact聯(lián)合查詢(xún)問(wèn)題

    在.net Core 5 WebAPI 項(xiàng)目中應(yīng)用 EF Core 5 實(shí)體框架,使用Linq的Contact聯(lián)合進(jìn)行多表查詢(xún)。 定義兩個(gè)子查詢(xún)語(yǔ)句,查詢(xún)結(jié)果 select 返回的對(duì)象結(jié)構(gòu)類(lèi)型都是一致的。 Linq查詢(xún)結(jié)果集封裝對(duì)象類(lèi): DatingComplaint 實(shí)體類(lèi)映射(Fluent API): 但在執(zhí)行到 ToListAsync() 代碼行查詢(xún)返回結(jié)果時(shí),拋

    2024年02月13日
    瀏覽(20)
  • C#中的LINQ

    一:什么是LINQ LINQ代表語(yǔ)言集成查詢(xún),是.net框架的擴(kuò)展,它允許我們用SQL查詢(xún)數(shù)據(jù)庫(kù)的方式來(lái)查詢(xún)數(shù)據(jù)的集合 二:LINQ延遲查詢(xún)的特性 延遲查詢(xún)是指查詢(xún)操作并不是在定義的時(shí)候執(zhí)行,而是在遍歷集合中的數(shù)據(jù)時(shí)才執(zhí)行 因?yàn)樽鳛閥ield迭代器的主體,只有使用foreach遍歷執(zhí)行到

    2023年04月09日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包