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

来源:互联网 发布:网络交换机辐射大不大 编辑:程序博客网 时间:2024/06/05 15:59
环境:.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<intint> f1 = x => x+1;
int i = f1(4);
i的值为5.
二参数例子:
定义委托
delegate R Func<A, R>(A arg, A arg2);

在程序里使用
 
Func<intint> 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[21, 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[212 };
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饿了,吃饭去了。
原创粉丝点击