LINQ-Lambda式

16529 ワード

LINQ-Lambda式
Posted on 2008-01-17 16:30sunrack読解(167)コメント(0)編集コレクション網摘み所属分類:LINQ
一、いつLambda式を使用するか総じて言えば、Lambda式は匿名の方法やエージェントを使用する必要がある場所で使用することができます.コンパイラはLambda式を標準の匿名メソッドにコンパイルします(ildasm.exe or reflector.exeで確認できます).たとえば、次のようになります.
List evenNumbers = list.FindAll(i => (i % 2) == 0);
にコンパイル
List evenNumbers = list.FindAll(delegate (int i) {     return (i % 2) == 0; });
二、Lambda式の解読Lambda式の書き方
ArgumentsToProcess(パラメータ)=>StatementsToProcessThem(レポート)
たとえば
// "i" is our parameter list.// "(i % 2) == 0" is our statement set to process "i". List evenNumbers = list.FindAll(i => (i % 2) == 0);
このように理解すべきだ
// My list of parameters (in this case a single integer named i)// will be processed by the expression (i % 2) == 0. List evenNumbers = list.FindAll((i) => ((i % 2) == 0));
入力パラメータのタイプを明示的に指定できます
List evenNumbers = list.FindAll((int i) => (i % 2) == 0);
カッコを使用して入力パラメータと式を囲むことができます.パラメータまたは処理式が1つしかない場合は、カッコを省略できます.
List evenNumbers = list.FindAll((i) => ((i % 2) == 0));
複数行の処理式がある場合は、カッコで囲む必要があります.
List evenNumbers = list.FindAll((i) => { Console.WriteLine("value of i is currently: {0}", i); bool isEven = ((i % 2) == 0); return isEven; });
入力パラメータが複数ある場合
SimpleMath m = new SimpleMath(); m.SetMathHandler((msg, result) => {Console.WriteLine("Message: {0}, Result: {1}", msg, result);});
または入力パラメータのタイプを明示的に指定します.
m.SetMathHandler((string msg, int result) => {Console.WriteLine("Message: {0}, Result: {1}", msg, result);});
パラメータが入力されていない場合
VerySimpleDelegate d = new VerySimpleDelegate( () => {return "Enjoy your string!";} );
LINQ Lambda式の例
Posted on 2008-02-18 09:56sunrack読解(136)コメント(0)編集コレクション網摘み所属分類:LINQ
Lambda式は、エージェントと匿名エージェントを使用する場所1で、関数の名前を付けることができます.
public class Common { public delegate bool IntFilter(int i); public static int[] FilterArrayOfInts(int[] ints, IntFilter filter) { ArrayList aList = new ArrayList(); foreach (int i in ints) { if (filter(i)) { aList.Add(i); } } return ((int[])aList.ToArray(typeof(int))); } }
 
public class Application { public static bool IsOdd(int i) { return ((i & 1) == 1); } }
 
using System.Collections; int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd); foreach (int i in oddNums) Console.WriteLine(i);
2、匿名関数
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int[] oddNums = Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); }); foreach (int i in oddNums) Console.WriteLine(i);
3、Lambda式
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1)); foreach (int i in oddNums) Console.WriteLine(i);
3つの方式の比較
int[] oddNums = // using named method Common.FilterArrayOfInts(nums, Application.IsOdd); int[] oddNums = // using anonymous method Common.FilterArrayOfInts(nums, delegate(int i){return((i & 1) == 1);}); int[] oddNums = // using lambda expression Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
ネーミング関数は短いが、処理関数を定義し、再利用できる利点がある.
Lambda式についての一二三を学ぶ
私はバカなので、lambdaとは何か分かりませんが、ネット上のN編の文章を見てもまだバカです.まだ分かりません.それで.自分で読むことができる文章を書いて、後で馬鹿な時に見て馬鹿ではないことを望んでいます.
依頼
依頼は参照メソッドのタイプです.依頼にメソッドが割り当てられると、依頼はそのメソッドと全く同じ動作をします.委任メソッドの使用は、他の任意のメソッドと同様に、パラメータと戻り値を持つことができます.
漫画
依頼は1つの関数に個別の名前を付けることです.using System; // Declare delegate -- defines required signature: delegate void SampleDelegate(string message); class MainClass {     // Regular method that matches signature:     static void SampleDelegateMethod(string message)     {         Console.WriteLine(message);     }     static void Main()     {         // Instantiate delegate with named method:         SampleDelegate d1 = SampleDelegateMethod;         // Instantiate delegate with anonymous method:         SampleDelegate d2 = delegate(string message)         {              Console.WriteLine(message);          };         d1("Hello");                  d2("World,http://www.dc9.cn/");     } }
これも依頼だpublic Form1() {     InitializeComponent();      this.Click += this.MultiHandler;  } private void MultiHandler(object sender, System.EventArgs e) {     MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }
匿名メソッド
匿名の方法は無名の依頼だ.名前はありませんが、「delegate」を付けて名前がないことを表示しなければなりません.// Create a delegate instance delegate void Del(int x); // Instantiate the delegate using an anonymous method Del d = delegate(int k) { /* ... */ }; Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); }; delegate void Printer(string s); Printer p = delegate(string j)         {             System.Console.WriteLine(j);         }; p("The delegate using the anonymous method is called."); delegate string Printer(string s);         private void button1_Click(object sender, EventArgs e)         {                      Printer p =delegate(string j)                     {                        return (j)+" ";                     };             Console.WriteLine(p("The delegate using the anonymous method is called."));         }
あるいは有名です...の匿名依頼...ははは、私は風を吸っていますか、それともマイクロソフトが風を吸っていますか.私を死なせてください.delegate void Printer(string s);         private void button1_Click(object sender, EventArgs e)         {             Printer p = new Printer(Form1.DoWork);             p("http://www.dc9.cn/");         }         static void DoWork(string k)         {             System.Console.WriteLine(k);         }
匿名の方法は終わりです.
漫画
Lamdbaは(int x)=>{x+1}です..例は、上に書いたlambdaでこう書きますdelegate string Printer(string s);         private void button1_Click(object sender, EventArgs e)         {             Printer p = j => j+" !!!";             Console.WriteLine(p("The delegate using the anonymous method is called."));         }
また、上記と同じように使うことができるのは、簡略化されています.public Form1() {     InitializeComponent();      this.Click += (s, e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString());}; }
超難+==>?実は難しくないです.难しいのは普通の関数に変换してどのように书きますか???です...
WhereはEnumerableの1つの方法です.3.5ならではです.中のパラメータはFunc<(Of<(T,TResult>))汎用依頼
Func<(Of<(T,TResult>))汎用依頼using System; delegate string ConvertMethod(string inString); public class DelegateExample {    public static void Main()    {       // Instantiate delegate to reference UppercaseString method       ConvertMethod convertMeth = UppercaseString;       string name = "Dakota";       // Use delegate instance to call UppercaseString method       Console.WriteLine(convertMeth(name));    }    private static string UppercaseString(string inputString)    {       return inputString.ToUpper();    } }
汎用依頼と書くのはusing System; public class GenericFunc {    public static void  Main ()    {       // Instantiate delegate to reference UppercaseString method       Func<string, string> convertMethod = UppercaseString;       string name = "Dakota";       // Use delegate instance to call UppercaseString method       Console.WriteLine(convertMethod(name));    }    private static string UppercaseString(string inputString)    {       return inputString.ToUpper();    } }
Linqに適用してlambdaに変換しますdelegate bool TestFunc(string fruit);         private void button1_Click(object sender, EventArgs e)         {             List<string> fruits =new List<string> { "apple", "http://www.dc9.cn", "banana", "mango",                      "orange", "blueberry", "grape", "strawberry" };             TestFunc f = new TestFunc(DoWork);             Func<string, bool> f2 = DoWork;             IEnumerable<string> query = fruits.Where(f2);             foreach (string fruit in query)             Console.WriteLine(fruit);        }         private static bool DoWork(string k)         {           return   k.Length < 6;        }
使える.delegate bool TestFunc(string fruit);         private void button1_Click(object sender, EventArgs e)         {             List<string> fruits =new List<string> { "apple", "passionfruit", "banana", "mango",                      "orange", "blueberry", "grape", "http://www.dc9.cn" };             TestFunc f = DoWork;             Func<string, bool> f2 =k=> k.Length < 6;             IEnumerable<string> query = fruits.Where(f2);             foreach (string fruit in query)             Console.WriteLine(fruit);        }         private static bool DoWork(string k)         {           return   k.Length < 6;        }
使える
漫画 private void button1_Click(object sender, EventArgs e)         {             List<string> fruits =new List<string> { "apple", "passionfruit", "banana", "mango",                      "orange", "blueberry", "grape", "http://www.dc9.cn" };                          IEnumerable<string> query = fruits.Where(                 delegate(string k){                     return k.Length < 6;                 }                 );             foreach (string fruit in query)             Console.WriteLine(fruit);        }
使えるprivate void button1_Click(object sender, EventArgs e)         {             List<string> fruits =new List<string> { "apple", "passionfruit", "banana", "mango",                      "orange", "blueberry", "grape", "http://www.dc9.cn" };                          IEnumerable<string> query = fruits.Where(k=>k.Length<6);             foreach (string fruit in query)             Console.WriteLine(fruit);        }
最后に、lambdaは、~~~~でみそ紫になる~~~~で、私のこのばかは、自分で書いたチュートリアルに理解されました.それで私もできました.でもやっぱり気持ち悪い.........ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ      public delegate int mydg(int a, int b);             public static class LambdaTest       {                      public static int oper(this int a, int b, mydg dg)           {               return dg(a, b);           }       }   Console.WriteLine(1.oper(2, (a, b) => a + b)); Console.WriteLine(2.oper(1, (a, b) => a - b));