webabcd - 专注于asp.net

ASP.NET
从现在开始 一切都不晚
posts - 149, comments - 4064, trackbacks - 328, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[索引页]
[源码下载]


步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)


作者:webabcd


介绍
    ·LambdaExpressions(Lambda表达式)
    ·QuerySyntax(查询语法)
    ·AnonymousTypes(匿名类型)


示例
LambdaExpressions.cs(Lambda表达式)
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;

using System.Collections.Generic;

/// <summary>
/// LambdaExpressions(Lambda表达式)的摘要说明
/// </summary>

public class LambdaExpressions
{
    
public int ID getset; }
    
public string Name getset; }

    
public void LambdaExpressionsTest()
    
{
        List
<LambdaExpressions> list = new List<LambdaExpressions>
        
{
            
new LambdaExpressions { ID = 1, Name = "webabcd" },
            
new LambdaExpressions { ID = 2, Name = "webabcdefg" },
            
new LambdaExpressions { ID = 3, Name = "webabcdefghijklmn" }
        }
;

        IEnumerable
<LambdaExpressions> l = list.Where(le => le.Name == "webabcd");

        
// 上面的(Lambda表达式)等同于下面的(匿名方法)

        
// IEnumerable<LambdaExpressions> l2 = list.Where(delegate(LambdaExpressions le) { return le.Name == "webabcd"; });



        
// 相关委托
        
// public delegate TResult Func<T, TResult>(T arg);
     
        
// 相关Where扩展方法
        
// Func<TSource, bool>:接受一个类型为TSource的参数
        
// Func<TSource, bool>:某个需要满足的条件,返回bool值
        
// public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
        
// {
        
//     foreach (TSource item in source)
        
//     {
        
//         if (predicate(item))
        
//         {
        
//             yield return item;
        
//         }
        
//     }
        
// }
        
    }

}


QuerySyntax.cs(查询语法)
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;

using System.Collections.Generic;

/// <summary>
/// QuerySyntax(查询语法)的摘要说明
/// </summary>

public class QuerySyntax
{
    
public int ID getset; }
    
public string Name getset; }

    
public void QuerySyntaxTest()
    
{
        List
<QuerySyntax> list = new List<QuerySyntax>
        
{
            
new QuerySyntax { ID = 1, Name = "webabcd" },
            
new QuerySyntax { ID = 2, Name = "webabcde" },
            
new QuerySyntax { ID = 2, Name = "webabcdef" },
            
new QuerySyntax { ID = 2, Name = "webabcdefg" },
            
new QuerySyntax { ID = 2, Name = "webabcdefgh" },
            
new QuerySyntax { ID = 2, Name = "webabcdefghi" },
            
new QuerySyntax { ID = 2, Name = "webabcdefghij" },
            
new QuerySyntax { ID = 2, Name = "webabcdefghijk" },
            
new QuerySyntax { ID = 2, Name = "webabcdefghijkl" },
            
new QuerySyntax { ID = 2, Name = "webabcdefghijklm" },
            
new QuerySyntax { ID = 3, Name = "webabcdefghijklmn" }
        }
;

        IEnumerable
<QuerySyntax> l = from o in list
                                     where o.Name.Length 
> 10
                                     orderby o.Name.Length descending
                                     select o;

        
// 上面的(查询语法)等同于下面的(LINQ扩展方法和Lambda表达式)
        
// 查询语法相对更容易理解

        
// IEnumerable<QuerySyntax> l = list.Where(o => o.Name.Length > 10).OrderByDescending(o => o.Name.Length);



        
// Projection(映射)
        
// 可以返回一个新的类型
        IEnumerable<Projection> l2 = from o in list
                                      where o.Name.Length 
> 10
                                      orderby o.Name.Length descending
                                      select 
new Projection { Name = o.Name };
    }

}


/// <summary>
/// 为了演示Projection(映射)而写的实体类
/// </summary>

public class Projection
{
    
public string Name getset; }
}


AnonymousTypes.cs匿名类型
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;

using System.Collections.Generic;

/// <summary>
/// AnonymousTypes(匿名类型)的摘要说明
/// </summary>

public class AnonymousTypes
{
    
public int ID getset; }
    
public string Name getset; }
    
public int Age getset; }

    
public void AnonymousTypesTest()
    
{
        List
<AnonymousTypes> list = new List<AnonymousTypes>
        
{
            
new AnonymousTypes { ID = 1, Name = "webabcd", Age = 10 },
            
new AnonymousTypes { ID = 2, Name = "webabcdefg", Age = 20 },
            
new AnonymousTypes { ID = 3, Name = "webabcdefghijklmn", Age = 30 }
        }
;

        
// listAnonymousTypes - 匿名类型
        var listAnonymousTypes = from l in list
                                 where l.Name 
== "webabcd"
                                 select 
new { Name = l.Name, Age = l.Age };

        
foreach (var v in listAnonymousTypes)
        
{
            
// v - 匿名类型,可以在Visual Studio中得到编译时检查和完整的intellisense
            string name = v.Name;
            
int age = v.Age;
        }


        
// 声明匿名类型:将new关键词后面的类型名称省略掉
        var person = new { Name = "webabcd", Age = 27 };
        
// person - 匿名类型,可以在Visual Studio中得到编译时检查和完整的intellisense
        string myName = person.Name;
        
int myAge = person.Age;
    }

}


OK
[源码下载]

Feedback

#1楼    回复  引用    

2007-10-12 17:30 by ivw [未注册用户]
支持。。。。。。。。。。。

#2楼 [楼主]   回复  引用  查看    

2007-10-12 18:40 by webabcd      
@ivw
:)
多谢

#3楼    回复  引用    

2007-10-13 10:56 by ivw [未注册用户]
兄弟,请问ObjectDataSource控件能实现海量分页吗?

#4楼    回复  引用    

2007-10-14 00:20 by ivw [未注册用户]
请问为什么我继承TextBox控件,但设计时在Text属性里输入的文字不是Text="123"这样程现,而是<textbox id="aaa">123</textbox>

#5楼    回复  引用    

2007-10-14 20:48 by 黑白 [未注册用户]
利用周末的时间,总算跟上了
.net 3.5带来了很多好东西啊

#6楼 [楼主]   回复  引用  查看    

2007-10-15 07:57 by webabcd      
@ivw
ObjectDataSource可以实现的
应用startRowIndex和maximumRows

“<textbox id="aaa">123</textbox>”?这样?那这应该是输出到客户端html,而不是asp.net的控件啊

#7楼 [楼主]   回复  引用  查看    

2007-10-15 07:58 by webabcd      
@黑白
:)
是的
好东东很多

#8楼    回复  引用    

2007-10-15 08:57 by ivw [未注册用户]
打错了,前面是<asp:TextBox>...,这样的。是服务器控件,就算在标准的TextBox里Text里输入内容也是这样的。

#9楼 [楼主]   回复  引用  查看    

2007-10-15 10:24 by webabcd      
@ivw
我试了一下
原来的TextBox控件也是你说的那种情况

#10楼    回复  引用    

2007-10-15 23:10 by ivw [未注册用户]
就是奇怪,连标准的也是一样,但他还是有Text这属性可以赋值,label是在Text里的,

#11楼 [楼主]   回复  引用  查看    

2007-10-16 08:25 by webabcd      
@ivw
:)
其实都是一样的

#12楼    回复  引用    

2007-10-16 08:44 by ivw [未注册用户]
如果是一样,但我在自定义TextBox里添加了一个集合属性,就会出错了。
<asp:TextBox Id="tx1" runat="server" >123
<a>
<cc1:b>
</cc1:b>
</a>

</asp:TextBox>

#13楼 [楼主]   回复  引用  查看    

2007-10-16 08:58 by webabcd      
@ivw
确实
那就要重写TextBox的Render方法了,没有源码的情况下挺麻烦的
权宜之计,现在如果要设置TextBox的Text属性,就直接在HTML视图里写吧

#14楼    回复  引用    

2007-10-16 17:12 by ivw [未注册用户]
重写Render方法,在write方法里输出Text属性吗?
这样好像不行啊?你有时间可以试试看,继承TextBox,然后定义一个集合属性,在设计模式时的Text属性里输入文字,再在集合属性里添加,看会不会出错。我这里就出错了

#15楼 [楼主]   回复  引用  查看    

2007-10-16 18:34 by webabcd      
@ivw
嗯,重写Render肯定行,就是麻烦
等开源了就方便了,很快了

现在就只能在HTML视图手写Text属性,然后设置你的集合属性就不会出错了

#16楼    回复  引用    

2007-10-16 19:08 by ivw [未注册用户]
你也试到了这种程况吗?Render不是可以重写吗?
protected override void Render(HtmlTextWriter writer)

#17楼 [楼主]   回复  引用  查看    

2007-10-17 07:47 by webabcd      
@ivw
就是重写那个,在原来的代码上改一改就好了
所以等.net开源后就好办了

#18楼    回复  引用    

2007-10-17 09:53 by ivw [未注册用户]
现在不是可以在里面改东西吗?
protected override void Render(HtmlTextWriter writer)
{
  。。。。。
}
难道你说是要修改Render本身?

#19楼 [楼主]   回复  引用