ASP.NET MVC 5(五)c#のlambda式、LinQおよびAsync非同期処理
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クエリ
シンボル"=>"はgoes toと読み、付与演算"="と同じ優先度を持ち、シンボル"=>"の右側のlambda式が「式lambda」になります.彼はいくつかの形式を持っています.
式Lambdaのボディには、メソッド呼び出しが含まれます.
自分が自分のlambda式を呼び出したい場合は、委任呼び出しを使用するか、Func<>を使用します.
varキーを使用して、タイプ推定または暗黙タイプと呼ばれるローカル変数を定義します.
タイプまたは構造を指定せずに直接定義できます.
myAnonTypeは匿名タイプのオブジェクトですが、ダイナミックではなく、依然として強いタイプです.つまり、初期化器{}」で定義した属性にのみ値を割り当てるか、値を取ることができ、定義を変更することはできません.コンパイラがコンパイルされると、この匿名タイプにクラスが生成され、同じ属性名を持つ2つの匿名タイプオブジェクトが同じクラスに割り当てられます.
LINQは、SQL文と同様に、オブジェクトセット上でデータを問合せするために使用されます.たとえば、前章のLanguageFeaturesプロジェクトのHomeControlに次のコードを追加します.
/home/FIndeProductsに移動すると結果が得られます:kayak:275 LifeJack:48.95 Corner:34.95
上記のコードはSQL文に似ています.このスタイルはクエリー構文と呼ばれ、使いやすいですが、ソース・データ・グループごとにProductごとに匿名のオブジェクトを返し、別途処理する必要があります.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クエリーの場所を定義し、データソースを変更する場所にブレークポイントを挿入します.2つのブレークポイントがfoundProductsを表示すると変更が発生します.foundProductsを初期化した後、foundProductsを変更していませんが、ソースデータを変更しただけです.遅延したLINQという特性が表示されます.
asyncキーとawaitキーを使用するのは簡単な非同期処理方法です.次のようになります.
コードにはawaitキーワードが使用されており、コンパイラはGetAsyncメソッドが返すTask結果を待って同じメソッドの他の文を実行し続けることを望んでいることを示します.awaitキーワードを使用する場合は、メソッドの署名にasyncキーワードを追加する必要があります.しかし、MVCコントローラを使用して非同期方法を使用するには特別な技術が必要であるため、ここでは与えられていない.ここではasyncとawaitキーワードの役割を簡単に紹介したいだけです.
LINQクエリ式(C#プログラミングガイド)からhttps://msdn.microsoft.com/zh-cn/library/bb397676.aspx
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キーワードの役割を簡単に紹介したいだけです.