IEnumerableインターフェイスは、C#の開発プロセスは、その機能と使用方法を理解するための非常に重要なインタフェースが必要であるです。その簡単な使用方法を理解するために10の小さな例によるこの記事。
完全なソースコードです
この例では、マークされたコメントで説明した応答以下の10時間です。
それぞれの名前のTXXから始まる例です。以下からのアドバイスをお読みください。
システムを使用しました。 System.Collections.Genericを使用しました。 System.Configurationを使用しました。 System.IOを使用しました。 System.Linqのを使用しました。 System.Net.Httpを使用しました。 System.Threading.Tasksを使用しました。 FluentAssertionsを使用しました。 xUnitフレームを使用しました。 Xunit.Abstractionsを使用しました。 名前空間Try_More_On_IEnumerable { publicクラスのEnumerableTests { プライベート読み取り専用ITestOutputHelper _testOutputHelper。 公共EnumerableTests( ITestOutputHelper testOutputHelper) { _testOutputHelper = testOutputHelper。 } [ファクト] 公共ボイドT01普通的循环获取偶数() { //最終的な結果セットのストレージを作成 VAR =新しい新しい結果一覧<整数>(); のため(のvar I = 0;私は= 10 <;私は++) { //それは偶数、に設定する数字である場合 であれば(私は2 == 0%) { result.Add(I); } } //最終結果アサーション result.Should()が等しい(0,2 ,. 4 ,. 6 ,. 8、10);. } [ファクト] 公共ボイドT02通常の列挙() { //も静的メソッド列挙オブジェクト取得 VARの=はgetNumberの結果(10) //述語結果 。result.Should()が等しい(0,2 ,. 4 ,. 6 ,. 8、10); / ** * T01より少ない表現文言が書かれている一般良好な性能のセットを作成します * / } / // <まとめ> ///取得しても少ない最大 /// </要約> /// <PARAM NAME = "最大"> </ param>の /// <戻り値> </戻り値> プライベート静的IEnumerableを<整数>はgetNumber(INT最大) { 用(VARのI = 0;私は= maxの<; Iは++) { IF(I%2 == 0) { //各反復の結果を用いて、戻り収率リターン 収率リターンI。 } } } [ファクト] { 公共ボイドT02ローカル関数() { //ローカル関数によって得られた結果 = VARははgetNumber(10)結果; //結果をアサート Result.Should()が等しい(0,2 ,. 4 ,. 6 ,. 8、10); / ** *列挙取得するために、ローカル関数を使用してオブジェクト。 *静的メソッドと、ここで同様の効果。 *ローカル関数は、C#7.0のサポートだけで文法的な機能です。 *詳細については、ローカル関数で見つけることができます。https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/local-functions * / IEnumerableを<整数>はgetNumber(int型の最大) { (VARのI = 0;私は= maxに<; Iは++) { IF(I%2 == 0) 収率リターンI。 } } } } [ファクト] 公共ボイドT03、分離条件() { / ** *使用してフィルタ結果どこ *このアプローチは、「自己増力」と論理「判定が偶数である」分離論理 * / VAR結果getNumber =(10) .Where(= X> X%2 == 0) 。result.Should()が等しい(0,2 ,. 4 ,. 6 ,. 8、10); //反復だけインクリメント演算子を行います IEnumerableを<整数>はgetNumber(INT最大) { 用(VARのI = 0;私は= maxの<; Iは++) { 収率リターンI。 } } } [ファクト] 公共ボイドT04Linq数値()を生成する { ことが簡素化することができるので、デジタル増分のシーケンスを取得する方法に構築され、//システムの VARを=列挙結果 .Range(0 ,. 11) .Where(= X> Xを2 == 0%) 。result.Should()が等しい(0,2 ,. 4 ,. 6 ,. 8、10); } [ファクト] 公共ボイド出力233 T05() { // 3つのデジタル出力233 VAR =結果Get233()を取る;.(3) result.Should()が等しい(2 ,. 3 ,. 3); //デジタル出力5 23333 (5)結果= Get233()を取る;. 。result.Should()が等しいです( 2、3、3、3、3)。 IEnumerableを<整数> Get233() { 2 //最初の出力 収率リターン2; (真)一方 { //後に出力される3。 収量リターン3; } } / ** *ながら(真)がないことは注目に値しますこれは、無限ループにプログラムをリードする 歩留まりのリターンが実行のオンデマンド電源を使用することであるので、*。 //www.cnblogs.com/SilentCode/p/5014068.html:HTTPS:*この点に関して参照の右物品であってもよい * / } [ファクト] )10 50(得るために、公共のボイドT06小さな乱数 { / ** *濾過確率的50未満のデジタル数、獲得の10結果 * / 結果getRandom = VAR() .Where(= X> X <50) .Take(10) .toArray(); //アサート result.Should()HaveCount(10);. result.All(= X> X <50 ).Should()BeTrue();. のIEnumerable <整数> getRandom() { VAR =新しい新しいランダムランダム(); //連続的に0から100までの乱数出力 trueにしばらく() { 歩留まりRandom.Nextリターン(0、100 ); } } } [ファクト] 公共ボイド補体T07自動乱数() { //取得3桁 。VAR =結果1のGetData()を取る(3); // 3桁が0,1,2である result1.Should()が等しい(0 ,. 1,2);. // 10を取得するデジタル (VARの結果2 =のGetData ).Take(10).toArray(); //最初の5桁が0,1,2,3,4である 。result2.Take(5).Should()が等しい(0 ,. 1,2 ,. 3 ,. 4 ); // 5桁目から開始して10より大きい result2.Skip(> 10 5).Take(5).Should()が一致する場合(X => x.All(A => A)); / * * *データのセットを、最初の5つの数字の0,1,2,3,4を取得します。乱数と比較して後ろに取得し続ける * / IEnumerableを<整数>のGetData() { VAR StaticData新しい新しい= [] {0 ,. 1,2 ,. 3 ,. 4}。 foreachの(StaticData中のvar I) { 私は収率を返す; } VAR =新しい新しいランダムランダム(); //連続の乱数10~100出力する 一方(真の) { 歩留まりRandom.Nextリターン(10、100); } } } [ファクト] 公共ボイド条件トランスフェクトT08サイクル() { varは= BOOK1 GetReadingBook(DateTime.Parse( "2019年8月30日"))まず();. 。book1.Shouldは()ての( "幸せな一日の毎週金曜日です"); VARブック2 GetReadingBook =(DateTime.Parse( "2016年2月29日"))最初の();. book2.Should()であること( "quadrennial出会い"); 。BOOK3のVAR = GetReadingBook(DateTime.Parse( "2019年9月1日"))まず(); book3.Should()BeSameAs( "ソフトウェア開発小さなクーデター三〇から二のボス月"); //が与えられます本のタイトル読み取るために必要な時間 のIEnumerable <文字列> GetReadingBook(DateTimeの時間を) { //金曜日 IF(time.DayOfWeek == DayOfWeek.Fridayは) { ;収量リターンが「毎週金曜日は幸せな一日です」 } // 2 29月 IF(time.Date.Month == 2 && time.Date.Dayの== 29) { ;収率リターン"quadrennial出会い" } 古典を読み取る//他の時間 イールド・リターン「小さなクーデター三〇から二ソフトウェア開発ボス月」; } } [ファクト] 公共ボイドT09は、リンク文字列を取得する() { //現在利用可能なリンク列を取得 するvar CONN = GetConnectionString()FirstOrDefaultを( 。 ); 。(BEのconn.Should() "ソース=サイバトロン; UID =月X-;パスワード= ******"); IEnumerableを<文字列> GetConnectionString() { //ファイルからリンク文字を取得文字列 VAR connFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory、 "conn.txt"); IF(File.Exists(connFilename)) { VAR =含むFileContent File.ReadAllText(connFilename)。 収量を返す含むFileContent; } //は、構成ファイルから読み取ら、接続文字列の VAR DBConnectionString ConfigurationManager.ConnectionStrings = [ "DB"を]のConnectionString;?。 IF(String.IsNullOrEmpty(DBConnectionString)!) { 降伏DBConnectionStringリターン; } //戻るデフォルトストリング 収率リターン"ソース=サイバトロン; UID =月のX;パスワード= ******"; } } [ファクト] パブリックネットワーク接続テスト非同期タスクT10() { VAR = HTTPClientの新しい新しいHttpClientを()。 試し { Task.WhenAllのawait(SendRequests()); _testOutputHelper.WriteLine( "通常の現在のネットワーク接続"); } キャッチ(例外E) { _testOutputHelper.WriteLine( "現在のネットワークが正常でない、ネットワーク接続をチェック"); } のIEnumerable <タスク> SendRequests() { 歩留まりTask.Runリターン(()=> httpClient.GetAsync( "http://www.baidu.com")); 収率Task.Runリターン(()=> httpClient.GetAsync(「HTTP: //www.bing.com ")); 収率Task.Runリターン(()=> httpClient.GetAsync(" http://www.taobao.com、「)); } } } }
ソース説明
上記の例では、ソースコード中に置かれ、ブログのサンプルコードライブラリインチ
プロジェクトでは、あなたが実行するためにnetcore 2.2 SDKをインストールする必要があり、ターゲットフレームワークとしてnetcore 2.2を使用しています。
- 著者:Newbe36524
- このリンク: http://www.newbe.pro/2019/09/01/Others/Try-More-On-IEnumerable/
- 免責事項:特に指定のない限り、これはすべての記事をブログ、使用されている BY-NC-SAの ライセンス。ソースを示してください!