.net 3.0+关于实现IEnumerable的类型的扩展方法的使用一

环境:.net framework 3.0以上 作者:lihui_830501
学习使用扩展方法之前,先学习一下Lambda表达式.Lambda表达式写成一个后面紧跟  => 标记的参数列表,=>之后是一个表达式或表语句块。Lambda表达式的参数可以是显型和隐型的。在显型参数列表中,每个参数的类型是显式指定的。在隐型参数列表中,参数的类型由lambda表达式出现的语境推导--特定地,当lambda表达式被转型到一个兼容的delegate类型时,delegate类型提供参数的类型.在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中省略。
以下是几种语法实现:
// 单一参数
=>  x  +   1 ;              
=>   return x + 1; } ;
(
int  x)  =>  x  +   1 ;
(
int  x)  =>   return x + 1; } ;
// 多参数:
(x, y)  =>  x  *  y;
// 无参数:
()  =>  Console.WriteLine();


单一参数例子:
定义委托
delegate  R Func < A, R > (A arg);

在程序里使用
 Func < int int >  f1  =  x  =>  x + 1 ;
int  i  =  f1( 4 );
i的值为5.
二参数例子:
定义委托
delegate  R Func < A, R > (A arg, A arg2);

在程序里使用
 
Func < int int >  f1  =  (x, y)  =>
                
{
                    
if (x > 3)
                    
{
                        
return x + y;
                    }

                    
else
                    
{
                        
return y;
                    }

                }
;
int  i  =  f1( 4 , 4 );

i的值为8.

下面再简单介绍一下扩展方法.扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,扩展方法使得用附加的方法扩展已存在类型和构造类型成为可能。扩展方法是通过指定关键字this修饰方法的第一个参数而声明的。扩展方法仅可声明在静态类中.
例如:
  public   static   class  Extensions
    
{
        
public static int ToInt32(this string s)
        
{
            
return Int32.Parse(s);
        }

    }

这样就在string类型上扩展了一个新的方法ToInt32.
string  s  =   " 1234 " ;
int  i  =  s.ToInt32(); 

在string变量s上直接就可以使用这个扩展方法了.更加详尽的资料请查阅相关文档.

实现IEnumerable的类型会有一些扩展方法如All<>.传递的参数就是Lambda表达式(x => x + 1).今天主要就是写一些自己学习这些方法的笔记.以最简单的数组为例:int[] array = new int[5]{1,2,3,4,5};
以下方法介绍全由array做例子,因为是int型数组,因此下面例子中的一些类型会也是INT型.
1.All<>方法:
All的意思大家都知道,就是全部的意思,这里就是迭代所有元素进行判断,返回布尔值.判断方法就是一个Lambda表达式.
如:
bool  b  =  array.All(i  =>  i  >   1 );

表达式需要返回bool值.
如果每个数组元素都大于1返回true否则false;

2.Any<>方法:
有二个重载,没有参数时,如果数组有元素就返回true否则false.有参数时,迭代所有元素进行判断,只要有元素符合判断就返回true否则false;
如:
bool  b  =  array.Any(); // 因为有5个元素因此返回true.
bool  b  =  array.Any(i  =>  i == 0 );
// 只要数组的其中一个元素等于0就返回true.这里没有等于0的元素,因此返回false.
// 表达式需要返回bool值.


3.Contains方法:检查某个元素是否在集合中.
4.AsEnumerable<>方法:返回一个IEnumerable<T>.
5.AsQueryable<>方法:返回一个IQueryable<T>.
6.AsReadOnly方法:返回一个只读IList<T>.

7.Where<>方法:
过滤集合的条件
如:
IEnumerable < int >  array2  =  array.Where(i  =>  i  >   3 ); // 返回元素大于3的新集合.结果int[2]{4,5}

表达式需要返回bool值.

8.Select<>,SelectMany<>方法:
跟据表达式选择结果,返回该结果的集合.
如:
IEnumerable < int >  a3  =  array.Select(i  =>  i  +   1 ); // 返回所有元素加1后产生的新集合.结果int[5]{2,3,4,5,6}
// 表达式需要返回int值.
IEnumerable < int >  a4  =  array.SelectMany(i  =>   new   int [ 2 1, i } ); // 返回每个表达式返回值组合起来的新集合.结果int[10]{1,1,1,2,1,3,1,4,1,5}
// 表达式需要返回IEnumerable<int>值.

9.OrderBy<>,OrderByDescending<>,ThenBy<>,ThenByDescending<>,Reverse<>方法:
OrderBy按升序排序,OrderByDescending按降序排序,ThenBy和ThenByDescending进行第二次排序,Reverse反转集合中元素的顺序
如:
IEnumerable < int >  a5  =  array.OrderBy(i  =>  i); // 返回升序后的集合

表达式需要返回关键字.在这里是int型的元素.
其它排序方法同上.
10.Join<>方法:
连接二个集合,类似SQL中的Join
如:
int [] array2  =   new   int [ 2 12 } ;
IEnumerable
< int [] >  a6  =  array.Join(array2, i  =>  i, n  =>  n, (x, y)  =>   new   int [ 2 { x, y } );

i是array的key,n是array2的key,最后返回二个数组相同的值的数组集合。返回集合的元素类弄要跟表达式的返回值类型一致.
另外一种写法:
IEnumerable < int [] >  a7  = from i1  in  array
                       join i2 
in  array2
                       on i1 equals i2
                       select 
new   int [ 2 ] {i1,i2} ;
l
未完待续。 lihui_830501饿了,吃饭去了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
普通方法: 1. 创建一个搜索表单 ```html <form action="/Home/Search" method="get"> <input type="text" name="query" placeholder="输入关键词进行搜索" /> <button type="submit">搜索</button> </form> ``` 2. 在控制器中创建一个Search方法,该方法将接收查询参数并返回符合条件的结果。 ```csharp public ActionResult Search(string query) { var results = db.Products.Where(p => p.Name.Contains(query)).ToList(); return View(results); } ``` 3. 创建一个Search视图,用于显示搜索结果。 ```html @model IEnumerable<Product> @foreach (var item in Model) { <div> <h2>@item.Name</h2> <p>@item.Description</p> <p>@item.Price</p> </div> } ``` 使用Ajax: 1. 创建一个搜索表单 ```html <form id="search-form"> <input type="text" name="query" placeholder="输入关键词进行搜索" /> <button type="submit">搜索</button> </form> ``` 2. 编写一个JavaScript函数,该函数将使用Ajax向服务器发送搜索请求,并在收到响应后更新页面内容。 ```javascript $(function () { $('#search-form').submit(function (event) { event.preventDefault(); var query = $('input[name="query"]').val(); $.ajax({ url: '/Home/Search', data: { query: query }, success: function (result) { $('#search-results').html(result); } }); }); }); ``` 3. 创建一个Search方法,该方法将接收查询参数并返回符合条件的结果。 ```csharp public ActionResult Search(string query) { var results = db.Products.Where(p => p.Name.Contains(query)).ToList(); return PartialView("_SearchResults", results); } ``` 4. 创建一个_SearchResults视图,用于显示搜索结果。 ```html @model IEnumerable<Product> @foreach (var item in Model) { <div> <h2>@item.Name</h2> <p>@item.Description</p> <p>@item.Price</p> </div> } ``` 注意:使用Ajax时,Search方法应返回一个局部视图(PartialView),该视图将仅包含搜索结果的HTML代码。此外,在客户端使用JavaScript更新页面时,应将结果插入到指定的HTML元素中(例如,使用id属性指定的元素)而不是完全替换整个页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值