람다 식 학습 - WPF - MVVM 패턴 연구는 4 노트

    슈퍼 클래스가 NotificationObject을 정의하는 학습 과정에서 MVVM은 같은 다음

    public abstract class NotificationObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        protected void RaisePropertyChanged(params string[] propertyNames)
        {
            if (propertyNames == null) throw new ArgumentNullException("propertyNames");

            foreach (var name in propertyNames)
            {
                this.RaisePropertyChanged(name);
            }
        }

        protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
        {
            var propertyName = ExtractPropertyName(propertyExpression);
            this.RaisePropertyChanged(propertyName);
        }

        public static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression)
        {
            if (propertyExpression == null)
            {
                throw new ArgumentNullException("propertyExpression");
            }

            var memberExpression = propertyExpression.Body as MemberExpression;
            if (memberExpression == null)
            {
                throw new ArgumentException("PropertySupport_NotMemberAccessExpression_Exception", "propertyExpression");
            }

            var property = memberExpression.Member as PropertyInfo;
            if (property == null)
            {
                throw new ArgumentException("PropertySupport_ExpressionNotProperty_Exception", "propertyExpression");
            }

            var getMethod = property.GetGetMethod(true);
            if (getMethod.IsStatic)
            {
                throw new ArgumentException("PropertySupport_StaticExpression_Exception", "propertyExpression");
            }

            return memberExpression.Member.Name;
        }

    }


      무효 RaisePropertyChanged <T> (식 보호하는 기능이있다 <Func을 <T >> propertyExpression을) 표현이 <Func을 <T> 난 정말 이해가 안 돼요, 다음 찾아 람다 식 I, 음, 솔직히 말해서,이다 람다 중 하나는 좋은 주니어 파트너 발췌 다운 말, 후아 꽉 ... 발생하기 전에, 다음 바닥에 도착, 그리고이 작은 달걀 통증이 조금 이해하는 배우려고 인터넷에서 많은 정보를 읽어보고 하하. 내가 예를 들어 다음과 같은 오전하는 것은 WPF 기반으로하기 때문에 (나는 몇 가지 바인딩이 싼 싸구려처럼 설명하고 버튼 명령을 사용하고, 원래 처음에는 직접보기를 추천하고 나의 기사로 돌아가 보면, 사람들은 좀 걱정 몽골 원을보고, 원본 텍스트를 보려면 여기를 클릭 )

람다 프로필

    람다 연산자, 익명의 위임의 사용을 단순화 코드가 더 간단하고 우아하게, C # 1.0의 가장 중요한 새로운 기능 때문에 마이크로 소프트의 하나라고한다.

    람다 연산자 : 모든 람다 표현식은 새로운 람다 연산자 "=>"당신은 "이동"또는 운영자를 호출 할 수 있습니다에있다 "가." 식의 조작이 두 부분으로 분할되어, 좌측에서 지정된 입력 파라미터는 오른쪽 람다의 주제이다.

    람다 식 :

           1. 변수 => 식 PARAM

           2. 복수의 파라미터 (paramlist) => 식

    이런 것들보다도, 기억 다음을 읽은 후 더 깊이 이해하고,보고를 켭니다.

람다 좋은거야?

    데모 천천히 분석하기 실시 예에 따르면

namespace LambdaDemo.ViewModel
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class VMLambdaStudyDemo1
    {
        public static List<Person> PersonsList()
        {
            List<Person> persons = new List<Person>();

            for (int i = 0; i < 7; i++)
            {
                Person p = new Person() {Name = i + "儿子",Age = 8-i};
                persons.Add(p);
            }
            return persons;
        }
        /// <summary>
        /// Btn_LambdaDemo1 Click事件
        /// </summary>
        public void Btn_LambdaDemo1_Click()
        {
            List<Person> persons = PersonsList();

            persons = persons.Where(p => p.Age > 5).ToList(); //所有Age>5的Person的集合

        }
    }

}

   위의 버튼을 위해 설계 데모 프로젝트는 사람의 집합을 떠나, Btn_LambdaDemo1을 누르면 5보다 큰 나이. 이러한 직접 모습이 초보자가 명확하지 않다 나를 위해, 나는 아직도 브레이크 포인트 추적처럼, 아래와 같이


   나는 프로그램을 실행, 33 행과 35 행, 37 행의 각각에 중단 점을 명중


  첫 번째 중단 점에있는 버튼 Btn_LambdaDemo1, 프로그램 숙박을 클릭

  

  이 때, 사람이 컬렉션의 요소가 비어 볼 수 있습니다, 바로 다음 중단 점 F5로 실행


이 시점에서 우리는 사람이 일곱 개 요소의 세트에 추가 된 것을 발견 한 후 F5는 다음 브레이크 포인트로 실행


     이 시간은 세 가지 요소에 사람의 컬렉션을 찾을 것,이 세 가지 요소는 필터링의 기준에 맞지한다.

     여기, 우리가이 람다 식 (P)가 => p.Age> (5)가 적용됩니다 것을 볼 수 있지만, 우리 모두가 알고, 좋은 일이 상대적으로 그것은 또한, 람다의 혜택을 볼 수 없습니다, Nazan 람다를 실현하지 않습니다 또 다른 방법이 선별 기능


    위와 같이, 나는 당신이 점 추적 비트를 깰 수, 37 개 라인이 선별 기능 -46 코드의 라인을 달성하기 위해, 라인 (35)을 보호하며, 마지막으로 우리의 요구를 달성 할 수있다. 여기에, 위의 두 가지 방법을 비교 페어, 우리는 장처럼 될 수는 학생들이 "람다 참으로 달콤한 일이다"고 말했다. (이 프로젝트는 다운로드에, 필요한 경우, 비교적 간단 다운로드하려면 여기를 클릭 )

람다는 정말 좋은

    위의 예에서, 나는 람다의 장점을 설명하기 위해, 일반적인 방법으로 람다와 비교하는 데 사용하지만, 실제로이 이론 비교해서는 안된다. 제가 도입 이전 람다에서 언급하기 때문에 람다 단순화 응용 프로그램 익명의 위임, 코드보다 간결을 너무 이론적으로 나는 람다의 이익을 가져올에 익명의 수수료를 사용해야합니다. 여기가 얼마나 결국 (P => p.Age> 5)이 표현을 살펴이야, 나는 아래에 위의 코드를 수정합니다

namespace LambdaDemo.ViewModel
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class VMLambdaStudyDemo1
    {
        //委托
        delegate List<Person> UNamedWeiTuo(List<Person> persons);

        public static List<Person> PersonsList()
        {
            List<Person> persons = new List<Person>();

            for (int i = 0; i < 7; i++)
            {
                Person p = new Person() {Name = i + "儿子",Age = 8-i};
                persons.Add(p);
            }
            return persons;
        }

        public void Btn_LambdaDemo1_Click()
        {
            List<Person> persons = PersonsList();

            UNamedWeiTuo uwt = WeiTuoFunc;

            persons = uwt(persons);
   
        }

        //委托方法
        public static List<Person> WeiTuoFunc(List<Person> persons)
        {
            List<Person> personstmp = new List<Person>();
            foreach (Person p in persons)
            {
                if (p.Age > 5)
                {
                    personstmp.Add(p);
                }
            }

            return personstmp;
        }
    }

}

   위의 코드에서, 나는 사람의 우리의 컬렉션을 달성하기 위해 삭제 옵션을 사용하는 방법에 의해 의뢰 (I 더 신뢰, 허, 자신의 뇌 보충에 대한 말을하지 않습니다) 수수료 UNamedWeiTuo에 대한 요구 사항을 정의했다. 람다 식과 대리인 (p => p.Age> 5) 비교 상술, 우리는 이점 식임을 알 수있다. 또한 볼 수있다 : 실제로, 식 (p => p.Age> 6) p 파라미터 위임 방법, 오른쪽 식의 기호를 나타낸다 

p.Age> 5 개 반환 결과는 대리자 메서드를 나타냅니다.

진행에 람다 구축

   직접 시트보다 직관적 인 예에 대한 다음 학생 :

   1. 단일 매개 변수

   사용 대리자 메서드

    

    public class VMLambdaStudyDemo1
    {
        //委托  逛超市
        delegate int GuangChaoShi(int a);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = JieZhang;
            MessageBox.Show(gwl(10) + ""); //打印结果为 "20"
   
        }

        public static int JieZhang(int a)
        {
            return (a + 10);
        }
    }

   사용 람다 표현식

    public class VMLambdaStudyDemo1
    {
        //委托  逛超市
        delegate int GuangChaoShi(int a);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = p => p + 10;
            MessageBox.Show(gwl(10) + ""); //打印结果为 "20"
   
        }

    }
   

   내 LadyGaGa 아, 다시 여기! 다중 매개 변수 greatful하지만 상대적으로 간단한 내부 연산 방법을 위임합니다.

   2. 다중 매개 변수, 간단한 조작 본체

   사용 대리자 메서드

    public class VMLambdaStudyDemo1
    {
        //委托  逛超市
        delegate int GuangChaoShi(int a,int b);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = JieZhang;
            MessageBox.Show(gwl(10,100) + ""); //打印结果为 "80"
   
        }

        //结账
        public static int JieZhang(int a, int b )
        {
            return (b - (a + 10));
        }
    }


   사용 람다 표현식

    public class VMLambdaStudyDemo1
    {
        //委托  逛超市
        delegate int GuangChaoShi(int a,int b);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = (p,z) => z - (p + 10);
            MessageBox.Show(gwl(10,100) + ""); //打印结果为 "80"
   
        }

    }


   아래 또는 다중 매개 변수, 나쁜,하지만 대리자 메서드 내부 작업을 더 복잡하지 않음

  3. 다중 매개 변수, 테마 계산 복잡도

  사용 대리자 메서드

    public class VMLambdaStudyDemo1
    {
        
        /// <summary>
        ///委托  逛超市
        /// </summary>
        /// <param name="a">花费</param>
        /// <param name="b">付钱</param>
        /// <returns>找零</returns>
        delegate int GuangChaoShi(int a,int b);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = JieZhang;
            MessageBox.Show(gwl(20,100) + ""); //打印结果为 "70"
   
        }

        //结账
        public static int JieZhang(int a, int b )
        {
            int zuidixiaofei = 10;
            if (b < zuidixiaofei)
            {
                return 100;
            }
            else
            {
                return (b - a - zuidixiaofei);
            }

        }
    }


  사용 람다 표현식

    public class VMLambdaStudyDemo1
    {
        
        /// <summary>
        ///委托  逛超市
        /// </summary>
        /// <param name="a">花费</param>
        /// <param name="b">付钱</param>
        /// <returns>找零</returns>
        delegate int GuangChaoShi(int a,int b);
        public void Btn_LambdaDemo1_Click()
        {
            GuangChaoShi gwl = (p, z) =>
                {
                    int zuidixiaofei = 10;
                    if (p < zuidixiaofei)
                    {
                        return 100;
                    }
                    else
                    {
                        return (z - p - zuidixiaofei);
                    }
                };

            MessageBox.Show(gwl(20,100) + ""); //打印结果为 "70"
   
        }

    }


  예 예, 나는 갑자기 람다 식을 열고, 당신에게 물품.

  이 예제 위 잘 이해에서, 나는 다음 발췌 장 학생들은 계속 시스템이 Func을 <T> 대리자를 지정 소개합니다.

FUNC <T> 대리자

   T는 대리인의 제네릭 형식 인 제네릭 형식의 매개 변수, 그것은보다 쉽게했다

   첫 번째 예

    public class VMLambdaStudyDemo1
    {
        
        public void Btn_LambdaDemo1_Click()
        {
            Func<int, string> gwl = p => p + 10 + "--返回类型为string类型";
            MessageBox.Show(gwl(10)); //打印结果为 "20--返回类型为string类型"
   
        }

    }

   설명, 당신은 여기에서 볼 수, p는 int 형 인수, 그러나 람다 몸 반환 문자열 유형, 당신은 ""추가하지 않는 내 MessageBox.Show ()를 참조하십시오.

   르 나를 그렇게 간단하게 이동합니다.

   앞의 예 다음

        public void Btn_LambdaDemo1_Click()
        {
            Func<int, int, bool> gwl = (p, j) =>
                {
                    if ((p + j) == 10)
                    {
                        return true;
                    }
                    return false;
                };
            MessageBox.Show(gwl(5,5) + ""); //打印结果为 "True"
   
        }

   참고 : 우리가 볼 수있는이 예에서, p는 j는 int 형, 부울 반환 값 유형이다,하는 int입니다.

   두 가지 예 위를 읽은 후, 나는 우리가 이해한다고 생각 Func을 <T> 사용법 : 매개 변수의 복수,위원회, 위임 메소드의 반환 유형에 대한 마지막 인수에 대한 매개 변수의 이전 방법 . 말을, 장의 정말 선택을 아에 대해 이야기 학생들이 아이디어!

람다 식 요약

      ① "람다 식"는 표현과 문장을 포함 할 수 있으며 수수료를 생성하는 데 사용할 수있는 익명 함수입니다.

      파라미터리스트 :() => 식 또는 문 블록 ② 람다 표현 형식

      방법을 생성합니다 ③ 분명하게 말하면, 람다 표현과 사실 익명 메소드는 자신의 역할에있다, 한 가지입니다. 즉, 인라인 방법.

      ④ 람다뿐만 아니라 수수료를 만드는 데 사용할 수, 그것은 또한 식 트리를 만드는 데 사용할 수 있습니다. 다음 섹션에서는 람다 식 트리에 대해 이야기합니다!

람다 식 트리

   참고 위의 자격 '람다 식 트리 "대신"람다 식 "그!

   ● 표현식 트리 개념

       ① 식 트리 또한 표현식 트리로서 공지 된 데이터 형식 언어 레벨 코드를 나타낸다. 모든 데이터는 각 노드는 식을 나타내고, 트리 구조로 저장된다.

        나무와 같은 표현 ② 람다 우리가 같은 람다 표현식을 다루는 (예 : 읽기와 같은 수정) 데이터를 처리 할 수 있습니다. (주 우리는 람다 식 나무와 람다 표현식 사이의 관계를 볼 수 있습니다 여기에!)

   유형 ● 표현 (나는 당신이 깊은 이해 모양 실험의 심화로 돌아오고, 알려 드리겠습니다)

        ① 파라미터 식 : ParameterExpression는 변수로 간주 될 수있는 검색 (문자열 키) 식 키와 같은 공정 매개 변수이다 (N => N * 3) N과 같은 람다 표현의 또 다른 예. 그것은 매개 변수의 표현으로 볼 수있다.

        ② 제 2 엘리먼트 식 : BinaryExpression을 예를 들어 B + 또는 (N * 3) <5 등이있다.

        MethodCallExpression, 예를 들어, 사용자 지정 작업 ORDERBY LINQ 공급자 구현 : 메소드 호출 식을 ③.

        ④ 상수 식 : constantExpression을 예컨대 5 값.

        조건식와 ⑤ 동작 : ConditionExpression

   많은 사람들이 우리가 설명하지 않는, MSDN을 볼 수 있습니다.

   다음은 간단한 예, 또는 트랙에 중단 점 방법의 사용을 줄 

    

        public void Btn_LambdaDemo1_Click()
        {
            Func<int, bool> test = n => (n * 3) < 5;

            Expression<Func<int, bool>> filter = n => (n * 3) < 5;        
                      
        }
    마찬가지로 프로그램에서 볼 수 있으며, 필터는 시험 람다 식 N => (N * 3) <5에서 사용되었지만, 식 필터를 사용하여 람다 표현식 트리 데이터 구조로 표현되고, 우리는 프로그램 추종 주행, 차이 무엇 결국이 두 봐.

    프로그램은 첫 번째 중단 점에 실행


   아래에 도시 된 바와 같이,이 때 시험 및 필터에서 두번 F5, 제 브레이크 포인트 프로그램 이동 비어 및 시험 필터를 확대


  이러한 바디 체로서 (N => (N * 3) <5) 정보 람다 식 많이 포함 된 필터는 인 상기도 모두 큰 차이의 내용 (N은 * 3)에서 알 수있는 < 5, 반환 형식은 하나 개의 매개 변수가, Boolen returnType이 유형입니다. 도 같은 필터 바디를 확장합니다.


   (가)는 N * (3), 본체 (5)이며, 노드 유형 <작음 등 정보량 큰 발언권의 우측으로 몸을 왼쪽으로 볼 수있는 내부 몸체 알 수있다.

   직관적 인 프리젠 테이션 기능 식 트리에 의해 다음 내부 정보

   

    public class VMLambdaStudyDemo1
    {
        
        public void Btn_LambdaDemo1_Click()
        {
            Func<int, bool> test = n => (n * 3) < 5;

            Expression<Func<int, bool>> filter = n => (n * 3) < 5;
            BinaryExpression lt = (BinaryExpression)filter.Body;
            BinaryExpression mult = (BinaryExpression)lt.Left;
            ParameterExpression en = (ParameterExpression)mult.Left;
            ConstantExpression three = (ConstantExpression)mult.Right;
            ConstantExpression five = (ConstantExpression)lt.Right;
            var One = filter.Compile();
            MessageBox.Show(One(5) + " || " + One(1) + " || " 
                        + lt.NodeType  + " || " + mult.NodeType
                         + " || " + en.Name + " || " + 
                         three.Value + " || " + five.Value);
                      
        }

    }
     중단 점을 추적하고 자신을 볼 수있다, 나는 그가 말했다 좋은 문제의 스크린 샷을 보여주지 않습니다. 다음은 프로그램의 결과는


    이 문장, 다시 예를 들어, 깊은 인상 "나무는 우리와 같은 람다 표현식으로 처리 (예 : 읽기와 같은 수정) 데이터를 처리 할 수 ​​있습니다처럼 람다 표현식을"위의 예는 시각적으로 표시 할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace LambdaDemo.ViewModel
{

    public class VMLambdaStudyDemo1
    {
        
        public void Btn_LambdaDemo1_Click()
        {
            ParameterExpression a = Expression.Parameter(typeof(int), "i"); //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
            ParameterExpression b = Expression.Parameter(typeof(int), "j");
            BinaryExpression be = Expression.Multiply(a, b);  //这里i*j,生成表达式树中的一个节点,比上面节点高一级

            ParameterExpression c = Expression.Parameter(typeof(int), "w");
            ParameterExpression d = Expression.Parameter(typeof(int), "x");
            BinaryExpression be1 = Expression.Multiply(c, d);

            BinaryExpression su = Expression.Add(be, be1);   //运算两个中级节点,产生终结点

            Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su, a, b, c, d);

            Func<int, int, int, int, int> f = lambda.Compile();  //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托;

            System.Windows.MessageBox.Show("lambda:" + lambda + "Result:" + f(1, 1, 1, 1));
        }

    }

}

실행 결과


코드 섹션에도 람다 식 트리 구조, 학생들 장의 직접 사용


이 사진과 함께 코드를 봐,주의 깊은 이해에서, 더 철저한 이해 할 수 있어야한다.

발문

   르 날을 사용하는 것이, 너무 오래, I (λ)는 상대적으로 이해 여기에 노크, 노크 코드보다 피곤 이상을 노크 갈하지만 생각? 답 : 아니오!

   배우면서 그러나 모든 권리, 준비는 보호 무효 RaisePropertyChanged <T> (표현 <Func을 <T >> propertyExpression)의 다음 NotificationObject보고


게시 된 143 개 원래 기사 · 원의 찬양 (161) · 조회수 1,210,000 +

추천

출처blog.csdn.net/mybelief321/article/details/44465845