IEnumerable 接口是 C# 開(kāi)發(fā)過(guò)程中非常重要的接口,對(duì)于其特性和用法的了解是十分必要的。本文將通過(guò)10個(gè)小例子,來(lái)熟悉一下其簡(jiǎn)單的用法。

          全是源碼

          以下便是這10個(gè)小例子,響應(yīng)的說(shuō)明均標(biāo)記在注釋中。

          每個(gè)以 TXX 開(kāi)頭命名的均是一個(gè)示例。建議從上往下閱讀。
          using System; using System.Collections.Generic; using System.Configuration;
          using System.IO; using System.Linq; using System.Net.Http; using
          System.Threading.Tasks; using FluentAssertions; using Xunit; using
          Xunit.Abstractions; namespace Try_More_On_IEnumerable { public class
          EnumerableTests { private readonly ITestOutputHelper _testOutputHelper; public
          EnumerableTests( ITestOutputHelper testOutputHelper) { _testOutputHelper =
          testOutputHelper; } [Fact] public void T01普通的循環(huán)獲取偶數(shù)() { // 創(chuàng)建一個(gè)集合存放最終結(jié)果 var
          result = new List<int>(); for (var i = 0; i <= 10; i++) { // 如果是偶數(shù)的話,將數(shù)字放入集合中
          if (i % 2 == 0) { result.Add(i); } } // 斷言最終的結(jié)果 result.Should().Equal(0, 2, 4,
          6, 8, 10); } [Fact] public void T02普通Enumerable() { // 通過(guò)靜態(tài)方法獲取偶數(shù)的Enumerable對(duì)象
          var result = GetNumber(10); // 斷言結(jié)果 result.Should().Equal(0, 2, 4, 6, 8, 10);
          /** * 這種寫(xiě)法比起 T01 的寫(xiě)法少了一個(gè)集合的創(chuàng)建,通常來(lái)說(shuō)是性能更佳的寫(xiě)法 */ } /// <summary> /// 獲取小于等于max的偶數(shù)
          /// </summary> /// <param name="max"></param> /// <returns></returns> private
          static IEnumerable<int> GetNumber(int max) { for (var i = 0; i <= max; i++) {
          if (i % 2 == 0) { // 使用 yield return 返回每次迭代的結(jié)果 yield return i; } } } [Fact]
          public void T02本地函數(shù)() { // 通過(guò)本地函數(shù)獲取結(jié)果 var result = GetNumber(10); // 斷言結(jié)果
          result.Should().Equal(0, 2, 4, 6, 8, 10); /** * 使用本地函數(shù)獲取 Enumerable 對(duì)象。 *
          此處的效果和靜態(tài)方法類似。 * 本地函數(shù)是 C# 7.0 才開(kāi)始支持的語(yǔ)法特性。 *
          關(guān)于本地函數(shù)詳細(xì)內(nèi)容可以參見(jiàn):https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/local-functions
          */ IEnumerable<int> GetNumber(int max) { for (var i = 0; i <= max; i++) { if (i
          % 2 == 0) { yield return i; } } } } [Fact] public void T03分離條件() { /** * 使用
          Where 過(guò)濾結(jié)果 * 這樣的做法分離了“自增”邏輯和“判斷是偶數(shù)”的邏輯 */ var result = GetNumber(10) .Where(x
          => x % 2 == 0); result.Should().Equal(0, 2, 4, 6, 8, 10); // 迭代時(shí)只是進(jìn)行了自增操作
          IEnumerable<int> GetNumber(int max) { for (var i = 0; i <= max; i++) { yield
          return i; } } } [Fact] public void T04Linq產(chǎn)生數(shù)值() { //
          系統(tǒng)內(nèi)置了一個(gè)方法來(lái)獲取數(shù)字的自增序列,因此可以如此簡(jiǎn)化 var result = Enumerable .Range(0, 11) .Where(x =>
          x % 2 == 0); result.Should().Equal(0, 2, 4, 6, 8, 10); } [Fact] public void
          T05輸出233() { // 輸出3個(gè)數(shù)字 233 var result = Get233().Take(3);
          result.Should().Equal(2, 3, 3); // 輸出5個(gè)數(shù)字 23333 result = Get233().Take(5);
          result.Should().Equal(2, 3, 3, 3, 3); IEnumerable<int> Get233() { // 第一次輸出 2
          yield return 2; while (true) { // 后面都輸出 3 yield return 3; } } /** * 值得注意的是
          while(true) 并不會(huì)導(dǎo)致程序陷入死循環(huán) * 因?yàn)?yield return 是采用按需供給的方式執(zhí)行的。 *
          關(guān)于這點(diǎn)可以參考右側(cè)文章:https://www.cnblogs.com/SilentCode/p/5014068.html */ } [Fact]
          public void T06獲取10個(gè)小于50的隨機(jī)數(shù)() { /** * 過(guò)濾隨機(jī)數(shù)中小于50的數(shù)字,只獲取其中10個(gè)結(jié)果 */ var result =
          GetRandom() .Where(x => x < 50) .Take(10) .ToArray(); // 斷言
          result.Should().HaveCount(10); result.All(x => x < 50).Should().BeTrue();
          IEnumerable<int> GetRandom() { var random = new Random(); // 不斷輸出 0-100 的隨機(jī)數(shù)
          while (true) { yield return random.Next(0, 100); } } } [Fact] public void
          T07自動(dòng)補(bǔ)足隨機(jī)數(shù)() { // 獲取3個(gè)數(shù)字 var result1 = GetData().Take(3); // 3 個(gè)數(shù)字分別為 0,1,2
          result1.Should().Equal(0, 1, 2); // 獲取 10 個(gè)數(shù)字 var result2 =
          GetData().Take(10).ToArray(); // 前 5 個(gè)數(shù)字分別為 0,1,2,3,4
          result2.Take(5).Should().Equal(0, 1, 2, 3, 4); // 從第 5 個(gè)開(kāi)始的數(shù)字都大于 10
          result2.Skip(5).Take(5).Should().Match(x => x.All(a => a > 10)); /** *
          獲取一組數(shù)據(jù),前5個(gè)數(shù)字是 0,1,2,3,4 。后面繼續(xù)獲取則為隨機(jī)數(shù) */ IEnumerable<int> GetData() { var
          staticData = new[] {0, 1, 2, 3, 4}; foreach (var i in staticData) { yield
          return i; } var random = new Random(); // 不斷輸出 10-100 的隨機(jī)數(shù) while (true) { yield
          return random.Next(10, 100); } } } [Fact] public void T08條件轉(zhuǎn)循環(huán)() { var book1 =
          GetReadingBook(DateTime.Parse("2019-08-30")).First();
          book1.Should().Be("每個(gè)周五都是快樂(lè)的一天"); var book2 =
          GetReadingBook(DateTime.Parse("2016-02-29")).First();
          book2.Should().Be("四年一次的邂逅"); var book3 =
          GetReadingBook(DateTime.Parse("2019-09-01")).First();
          book3.Should().BeSameAs("月老板軟件開(kāi)發(fā)小妙招三十二則"); // 獲取給定時(shí)間需要閱讀的書(shū)籍名稱
          IEnumerable<string> GetReadingBook(DateTime time) { // 周五 if (time.DayOfWeek ==
          DayOfWeek.Friday) { yield return "每個(gè)周五都是快樂(lè)的一天"; } // 2月29日 if (time.Date.Month
          == 2 && time.Date.Day == 29) { yield return "四年一次的邂逅"; } // 其他時(shí)間閱讀名著 yield
          return "月老板軟件開(kāi)發(fā)小妙招三十二則"; } } [Fact] public void T09獲取一個(gè)鏈接字符串() { //
          獲取一個(gè)當(dāng)前可用的鏈接字符串 var conn = GetConnectionString().FirstOrDefault();
          conn.Should().Be("Source=賽博坦;UID=月x;Password=******"); IEnumerable<string>
          GetConnectionString() { // 從一個(gè)文件中獲取鏈接字符串 var connFilename =
          Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "conn.txt"); if
          (File.Exists(connFilename)) { var fileContent = File.ReadAllText(connFilename);
          yield return fileContent; } // 從配置文件中讀取鏈接字符串 var dbConnectionString =
          ConfigurationManager.ConnectionStrings["db"]?.ConnectionString; if
          (!string.IsNullOrEmpty(dbConnectionString)) { yield return dbConnectionString;
          } // 返回默認(rèn)的字符串 yield return "Source=賽博坦;UID=月x;Password=******"; } } [Fact]
          public async Task T10測(cè)試網(wǎng)絡(luò)連接() { var httpClient = new HttpClient(); try { await
          Task.WhenAll(SendRequests()); _testOutputHelper.WriteLine("當(dāng)前網(wǎng)絡(luò)連接正常"); } catch
          (Exception e) { _testOutputHelper.WriteLine("當(dāng)前網(wǎng)絡(luò)不正常,請(qǐng)檢查網(wǎng)絡(luò)連接"); }
          IEnumerable<Task> SendRequests() { yield return Task.Run(() =>
          httpClient.GetAsync("http://www.baidu.com")); yield return Task.Run(() =>
          httpClient.GetAsync("http://www.bing.com")); yield return Task.Run(() =>
          httpClient.GetAsync("http://www.taobao.com")); } } } }
            

          源碼說(shuō)明

          以上示例的源代碼放置于博客示例代碼庫(kù)
          <https://github.com/newbe36524/Newbe.Demo/tree/master/src/BlogDemos/Try-More-On-IEnumerable>
          中。

          項(xiàng)目采用 netcore 2.2 作為目標(biāo)框架,因此需要安裝 netcore 2.2 SDK 才能運(yùn)行。

          * 本文作者:?Newbe36524
          * 本文鏈接:?http://www.newbe.pro/2019/09/01/Others/Try-More-On-IEnumerable/
          <http://www.newbe.pro/2019/09/01/Others/Try-More-On-IEnumerable/>
          * 版權(quán)聲明:?本博客所有文章除特別聲明外,均采用?BY-NC-SA
          <https://creativecommons.org/licenses/by-nc-sa/4.0/>?許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處!

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問(wèn)題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                小情侣出租屋激烈啪啪 | 靠逼视频网站免费观看 | 久久久久国产成人精品亚洲午夜 | 男人插女人网站 | A V视频在线 |