ASP.NET MVC 5(五)c#のlambda式、LinQおよびAsync非同期処理

8952 ワード

Lambda式とLINQ式を簡単に紹介し、詳細なC#言語文法は2つのリンクを調べ、詳細な実験と解釈は別の文法シリーズを開く.Lambda式(C#プログラミングガイド)https://msdn.microsoft.com/zh-cn/library/bb397687.aspx
LINQクエリ式(C#プログラミングガイド)からhttps://msdn.microsoft.com/zh-cn/library/bb397676.aspx
  • Lambda式基本構文スタイル
  • 自動インタフェースタイプ
  • 匿名タイプ
  • 言語統合クエリLINQ
  • を実行
  • いくつかのLINQ拡張方法のリスト
  • 遅延LINQクエリ
  • Lambda式基本構文スタイル

        =>       
    

    シンボル"=>"はgoes toと読み、付与演算"="と同じ優先度を持ち、シンボル"=>"の右側のlambda式が「式lambda」になります.彼はいくつかの形式を持っています.
        • (int x,int y)=>x==y    //              
        • (x,y)=>x==y              //        
        • (int x)=>x>12           //          
        • x=>{string n=x+" "+"World";Console.WriteLine(n);}//   
        • ()=>SomeMethod()     //     
    

    式Lambdaのボディには、メソッド呼び出しが含まれます.
    自分が自分のlambda式を呼び出したい場合は、委任呼び出しを使用するか、Func<>を使用します.
    //    
     delegate int mydelegate(int x, int y);
    public static void Main(string []args)
    {
         mydelegate del = (x, y) =>  x * y ;
        int total=del(12, 12);     //total==12*12==144
    }
    //Func<>  
      public static IEnumerable Filter(
                this IEnumerable productEnum, Func selectorParam)
            {
                foreach (Product prod in productEnum)
                {
                    if(selectorParam (prod))
                        yield return prod;
                }
            }
     public void UseFilterExtensionMethod()
            {
                IEnumerable products = new ShoppingCart
                {
                    Products = new List{
                        new Product{Name="kayak",Price=275M},
                        new Product{Name="LifeJack",Price=48.95M},
                        new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                        new Product{Name="Corner",Category="Soccer",Price=34.95M}
                    }
                };
                Func categoryFilter = prod => prod.Category == "Soccer"|| prod.Price>20;
        //      :Category == "Soccer|| prod.Price>20“       
                decimal total = 0, total1 = 0;
                foreach (Product prod in products.Filter(categoryFilter))
                {
                    total += prod.Price;
                }
        //          
            }
    

    自動インタフェースタイプ


    varキーを使用して、タイプ推定または暗黙タイプと呼ばれるローカル変数を定義します.
    var myVariable = new Product { Name="Kayak",Price=50};//  
    int count = myVariable.Count;    //   ,Product    Count  
    

    匿名タイプ


    タイプまたは構造を指定せずに直接定義できます.
    var myAnonType=new{Name="MVC",Category="Pattern"};
    

    myAnonTypeは匿名タイプのオブジェクトですが、ダイナミックではなく、依然として強いタイプです.つまり、初期化器{}」で定義した属性にのみ値を割り当てるか、値を取ることができ、定義を変更することはできません.コンパイラがコンパイルされると、この匿名タイプにクラスが生成され、同じ属性名を持つ2つの匿名タイプオブジェクトが同じクラスに割り当てられます.

    言語統合クエリーの実行(LINQ)


    LINQは、SQL文と同様に、オブジェクトセット上でデータを問合せするために使用されます.たとえば、前章のLanguageFeaturesプロジェクトのHomeControlに次のコードを追加します.
     public ViewResult FindeProducts()
            {
                Product[] products = {
                        new Product{Name="kayak",Category="Watesports",Price=275M},
                        new Product{Name="LifeJack",Category="Watesports",Price=48.95M},
                        new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                        new Product{Name="Corner",Category="Soccer",Price=34.95M}
                    };
            //LINQ  , products      Prcie           ,       Name   Price              
            var foundProducts = from match in products
                                orderby match.Price descending
                                select new { match.Name, match.Price };
                    string result = "";
            int i = 0;
           foreach (var prod in foundProducts)
           {
               i++;
               if (i >3)
                   break;
               result += prod.Name + ":" + prod.Price + " ";
           }
            return View("Result",(object)result);
        }
    

    /home/FIndeProductsに移動すると結果が得られます:kayak:275 LifeJack:48.95 Corner:34.95
    上記のコードはSQL文に似ています.このスタイルはクエリー構文と呼ばれ、使いやすいですが、ソース・データ・グループごとにProductごとに匿名のオブジェクトを返し、別途処理する必要があります.LINQにはもう一つのスタイルがあり、点記号文法と呼ばれ、拡張方法に基づいています.たとえば、上記のコードを次のコードに置き換えることで、同じコードを実現できます.
     public ViewResult FindeProducts()
            {
                Product[] products = {
                        new Product{Name="kayak",Category="Watesports",Price=275M},
                        new Product{Name="LifeJack",Category="Watesports",Price=48.95M},
                        new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                        new Product{Name="Corner",Category="Soccer",Price=34.95M}
                    };
                /*LINQ  , products      Prcie    ,       Name   Price              */
                var foundProducts = products.OrderByDescending(e => e.Price)
                    .Take(3).Select(e => new { e.Name, e.Price });
                string result = "";
               foreach (var prod in foundProducts)
               {
                   result += prod.Name + ":" + prod.Price + " ";
               }
                return View("Result",(object)result);
            }
    

    いくつかのLINQ拡張方法のリスト


    『ASP.NE MVC 5に精通』([美]Adam Freeman著,張成彬等訳)
    拡張メソッド
    説明
    ちえん
    All
    ソースデータのすべてのエントリが述語と一致する場合はtrueを返します.
    いいえ
    Any
    ソースデータの少なくとも1つのエントリが述語と一致する場合はtrueを返します.
    いいえ
    Contains
    データ・ソースに指定したエントリまたは値が含まれている場合はtrueを返します.
    いいえ
    Count
    データ・ソースを返すエントリ数
    いいえ
    First
    データ・ソースの最初のエントリを返します.
    いいえ
    FirstOrDefault
    データ・ソースの最初のエントリを返すか、エントリがない場合にデフォルト値を返します.
    いいえ
    Last
    データ・ソースの最後のエントリを返します.
    いいえ
    LastOrDefault
    データ・ソースの最後のエントリを返すか、エントリがない場合にデフォルト値を返します.
    いいえ
    Max Min
    Lambda式表現の最大値または最小値を返します.
    いいえ
    OrderByOrderByDescending
    Lambda式で返される値に基づいてソースデータをソート
    はい
    Reverse
    データ・ソースのデータ・アイテムの順序を反転
    はい
    Select
    クエリー結果の設計
    はい
    SelectMany
    各データ・アイテムをエントリ・シーケンスに投影し、これらの結果シーケンスをすべてシーケンスに接続します.
    はい
    Single
    データ・ソースの最初のエントリを返すか、複数の一致がある場合に例外を放出します.
    いいえ
    SingleOrDefault
    データ・ソースの最初のエントリを返すか、エントリがない場合はデフォルト値を返します.複数の一致するエントリがある場合、例外が放出されます.
    いいえ
    SkipSkipWhile
    指定した書目の要素をスキップするか、述語が一致するときにスキップします.
    はい
    Sum
    述語選択値の合計
    いいえ
    TakeTakeWhile
    データ・ソースの先頭から指定したエントリの要素を選択するか、述語が一致する場合に選択します.
    はい
    ToArrayToDictionaryToList
    データ・ソースを配列または他の集合タイプに変換
    いいえ
    Where
    データ・ソース・データの述語と一致しないエントリをフィルタします.
    はい

    遅延LINQクエリ


    遅延とは、結果を列挙するまでクエリが実行されず、列挙するたびにクエリの結果が最初から求められることを意味します.次のようになります.
    Product[] products = {
                                new Product{Name="kayak",Category="Watesports",Price=275M},
                                new Product{Name="LifeJack",Category="Watesports",Price=48.95M},
                                new Product{Name="Soccer",Category="Soccer",Price=19.58M},
                                new Product{Name="Corner",Category="Soccer",Price=34.95M}
                            };
             var foundProducts = products.OrderByDescending(e => e.Price)
                            .Take(3).Select(e => new { e.Name, e.Price });
                        string result = "";//   LINQ       
    
    products[2]=new Product{Name="kayak1",Category="Watesports",Price=276M};
                    //     
               foreach (var prod in foundProducts)
               {
                   result += prod.Name + ":" + prod.Price + " ";
               }//      ,              
    

    LINQクエリーの場所を定義し、データソースを変更する場所にブレークポイントを挿入します.2つのブレークポイントがfoundProductsを表示すると変更が発生します.foundProductsを初期化した後、foundProductsを変更していませんが、ソースデータを変更しただけです.遅延したLINQという特性が表示されます.
    asyncキーとawaitキーを使用するのは簡単な非同期処理方法です.次のようになります.
    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace LanguageFeatures.Models
    {
        public class MyAsyncMethods
        {
           public async static Task GetPageLength()
            {
                HttpClient client = new HttpClient();
                var httpMessage = await client.GetAsync("http://apress.com");
    
                return httpMessage.Content.Headers.ContentLength;
            }
        }
    }
    

    コードにはawaitキーワードが使用されており、コンパイラはGetAsyncメソッドが返すTask結果を待って同じメソッドの他の文を実行し続けることを望んでいることを示します.awaitキーワードを使用する場合は、メソッドの署名にasyncキーワードを追加する必要があります.しかし、MVCコントローラを使用して非同期方法を使用するには特別な技術が必要であるため、ここでは与えられていない.ここではasyncとawaitキーワードの役割を簡単に紹介したいだけです.