c# 3.0新特性之使用Lambda表达式

转载 2011年01月19日 18:04:00

c# 3.0新特性之使用Lambda表达式
2009年8月18日 云飞扬 发表评论 阅读评论
-
Working with Lambda Expressions 使用Lambda表达式
Lambda表达式有什么作用,它的使用方法是?
作用主要可以在匿名的方法的基础上,进一步简化代码,也可以隐藏delegate关键字
比如在2.0中代码如下:

var innerPoints = points.FindAll(delegate(Point p) { return (p.X > 0 && p.Y > 0); });

那么在C# 3.0 可以写为

var innerPoints = points.FindAll( p => p.X > 0 && p.Y > 0);

Lambda表达式的基本编写方法如以下代码所示:

(参数列表)=>{表达式};

表达式即事件处理方法体代码,参数列表是可选的,即完全可以省略参数列表的编写。

Lambda表达式中的参数可以是显式或者隐式类型的。在一个显式类型参数列表里,每个表达式的类型是显式指定的。在一个隐式类型参数列表里,类型是通过上下文推断出来的:
 
  (int x) => x + 1 // 显式类型参数
  (y,z) => return y * z; // 隐式类型参数

再举个例子

 return customers.FindAll(c => c.City == city);

可以取代一下

            return customers.FindAll(
                delegate(Customer c)
                {
                    return c.City == city;
                });
完整的源码,查找城市名为London的数据并打印出来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NewLanguageFeatures
{
 
    public static class Extensions
    {
     
        public static List<T> Append<T>(this List<T> a, List<T> b)
        {
            var newList = new List<T>(a);
            newList.AddRange(b);
            return newList;
        }
      
        public static bool Compare(this Customer customer1, Customer customer2)
        {
            if (customer1.CustomerId == customer2.CustomerId &&
                customer1.Name == customer2.Name &&
                customer1.City == customer2.City)
            {
                return true;
            }

            return false;
        }
    }

    public class Customer
    {
        public int CustomerId { get; private set; }

        public string Name { get; set; }
        public string City { get; set; }

        public Customer(int Id)
        {
            CustomerId = Id;
        }

        public override string ToString()
        {
            return Name + "/t" + City + "/t" + CustomerId;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var customers = CreateCustomers();

            foreach (var c in FindCustomersByCity(customers, "London"))
               Console.WriteLine(c);
        }
        public static List<Customer> FindCustomersByCity(
         List<Customer> customers,string city)
        {
            //return customers.FindAll(
            //    delegate(Customer c)
            //    {
            //        return c.City == city;
            //    });
            return customers.FindAll(c => c.City == city);

        }
        static List<Customer> CreateCustomers()
        {
            return new List<Customer>
                {
                    new Customer(1) { Name = "Alex Roland",             City = "Berlin"    },
                    new Customer(2) { Name = "Oliver Cox",              City = "Marseille" },
                    new Customer(3) { Name = "Maurice Taylor",          City = "London"    },
                    new Customer(4) { Name = "Phil Gibbins",            City = "London"    },
                    new Customer(5) { Name = "Tony Madigan",            City = "Torino"    },
                    new Customer(6) { Name = "Elizabeth A. Andersen",   City = "Portland"  },
                    new Customer(7) { Name = "Justin Thorp",            City = "London"    },
                    new Customer(8) { Name = "Bryn Paul Dunton",        City = "Portland"  }
                };
        }     
    }
}

一个更复杂的例子,查找打印姓名已T开头的人的信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NewLanguageFeatures
{
    public delegate bool KeyValueFilter<K, V>(K key, V value);
  
    public static class Extensions
    {
        public static List<K> FilterBy<K, V>(
        this Dictionary<K, V> items,
        KeyValueFilter<K, V> filter)
        {
            var result = new List<K>();

            foreach (KeyValuePair<K, V> element in items)
            {
                if (filter(element.Key, element.Value))
                    result.Add(element.Key);
            }
            return result;
        }
      
        public static List<T> Append<T>(this List<T> a, List<T> b)
        {
            var newList = new List<T>(a);
            newList.AddRange(b);
            return newList;
        }
      
        public static bool Compare(this Customer customer1, Customer customer2)
        {
            if (customer1.CustomerId == customer2.CustomerId &&
                customer1.Name == customer2.Name &&
                customer1.City == customer2.City)
            {
                return true;
            }

            return false;
        }
    }

    public class Customer
    {
        public int CustomerId { get; private set; }

        public string Name { get; set; }
        public string City { get; set; }

        public Customer(int Id)
        {
            CustomerId = Id;
        }

        public override string ToString()
        {
            return Name + "/t" + City + "/t" + CustomerId;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var customers = CreateCustomers();

            var customerDictionary = new Dictionary<Customer, string>();

            foreach (var c in customers)
                customerDictionary.Add(c, c.Name.Split(' ')[1]);

            var matches = customerDictionary.FilterBy(
                (customer, lastName) => lastName.StartsWith("T"));
            //上面执行查询操作

            foreach (var m in matches)
                Console.WriteLine(m);
        }

        public static List<Customer> FindCustomersByCity(
            List<Customer> customers,
            string city)
        {
            return customers.FindAll(c => c.City == city);
        }

        static List<Customer> CreateCustomers()
        {
            return new List<Customer>
                {
                    new Customer(1) { Name = "Alex Roland",             City = "Berlin"    },
                    new Customer(2) { Name = "Oliver Cox",              City = "Marseille" },
                    new Customer(3) { Name = "Maurice Taylor",          City = "London"    },
                    new Customer(4) { Name = "Phil Gibbins",            City = "London"    },
                    new Customer(5) { Name = "Tony Madigan",            City = "Torino"    },
                    new Customer(6) { Name = "Elizabeth A. Andersen",   City = "Portland"  },
                    new Customer(7) { Name = "Justin Thorp",            City = "London"    },
                    new Customer(8) { Name = "Bryn Paul Dunton",        City = "Portland"  }
                };
        }     
    }
}

 


本文来自: 本站内容欢迎转载,但是禁止去掉本文链接(转载无妨,去掉链接可耻!):http://www.ajaxcn.net/archives/183

C# 3.0 其他XML技术

使用XmlReader枚举结点: Jim Bo XmlReaderSettings settings = new XmlReaderSettings(); settings.Igno...
  • yangzhenping
  • yangzhenping
  • 2013年09月29日 16:55
  • 1743

使用Application Loader 3.0 上传ios手机应用安装文件一般步骤

1. 登陆application loader。 2. 选择”交付您的应用程序”,点击 “选取”。 3. 选择需要上传的应用安装文件。 4. 确认应用详细信息。确认无误点击下一步. ...
  • yuh_c
  • yuh_c
  • 2016年04月08日 21:01
  • 1915

protobuf V3 C# 中文机翻教程。

protocol buffer:C# 本教程提供了一个基本的C#程序员的介绍与PB的工作,使用proto3的PB语言的版本。通过创建一个简单的示例应用程序走,就说明你如何 定义一个...
  • DOwnstairs
  • DOwnstairs
  • 2016年05月25日 18:35
  • 1724

iOS开发之AFNetworking 3.0使用总结

昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了。。。上github上一看,发现没有这个了。刚...
  • zhaojinqiang12
  • zhaojinqiang12
  • 2017年01月11日 17:01
  • 722

GreenDao3.0使用详解

随着移动端的业务量的增大和用户体验的提高,SQLite的需求很明显了,大大小小的项目几乎成了必备,用我们项目经理的话来说: 1、不用管他什么数据,为了体验,先缓存一下! 2、什么?网络不好导致的?看什...
  • u014752325
  • u014752325
  • 2017年01月04日 10:47
  • 9901

关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0)

关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0) 分类: EMGU CV2015-05-27 14:44 1590人阅读 评论(0) 收藏 举报 图像处...
  • lphbtm
  • lphbtm
  • 2016年07月14日 14:57
  • 1129

detours使用:detours3.0文档翻译

来自:http://blog.csdn.net/buck84/article/details/8289991 目录(?)[-] 拦截二进制函数使用DetoursPayloa...
  • xrain_zh
  • xrain_zh
  • 2015年04月07日 11:49
  • 723

dotTrace界面详解

dotTrace界面详解
  • weixin_38208401
  • weixin_38208401
  • 2017年07月21日 15:36
  • 208

C# 3.0 介绍(二)

在第一篇中,我已经和大家简单介绍了linq。也和大家提起linq是C# 3.0里的一个特性。不过,你去装linq priview时,你会发现,它提供了许多vb的linq代码。从现在的情况看,linq会...
  • iamdll
  • iamdll
  • 2014年03月21日 15:15
  • 299

C# 3.0 介绍(三)

从本节开始,笔者将会和大家一起开始体验dlinq了。前面我们准备了数据库,也对数据库之间的关系做了初步的了解。有了数据库之后,数据和对象是一个什么样的关系呢?从dlinq的设计来看,它主要是为了解决d...
  • iamdll
  • iamdll
  • 2014年03月21日 15:16
  • 319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 3.0新特性之使用Lambda表达式
举报原因:
原因补充:

(最多只允许输入30个字)