IEnumber

咋一看到IEnumerable这个接口,我们可能会觉得很神奇,在一般的编程时,基本上我们是想不到去用它的,可是,俗话说得好,存在便是道理,那么,它对我们来说,能够带来哪些奇妙的事情呢?

要想弄懂它,我们还是看看其定义吧!

在MSDN上,是这么说的,它是一个公开枚举数,该枚举数支持在非泛型集合上进行简单的迭代。换句话说,对于所有数组的遍历,都来自IEnumerable,那么我们就可以利用这个特性,来定义一个能够遍历数组的通用方法,这样看来,是不是很神奇呢?

例如:

  1. public static void Print(IEnumerable myList)

  2. {

  3. int i = 0;

  4. foreach (Object obj in myList)

  5. {

  6. if (obj is Student)//这个是类型的判断,这里Student是一个类或结构

  7. {

  8. Student s=(Student)obj;

  9. Console.WriteLine("\t[{0}]:\t{1}", i++, s.Sname);

  10. }

  11. if (obj is int)

  12. {

  13. Console.WriteLine("INT:{0}",obj);

  14. }

  15. }

  16. Console.WriteLine();

  17. }


 

上面,我们可以在foreach中进行多个if判断,来进行相应的操作。

IEnumerable 的另一个用法是在泛型中的使用。其中用lamda表达式在数组中查询,具体例子如下:

  1. List<string> fruits =

  2. new List<string> { "apple", "passionfruit", "banana", "mango",

  3. "orange", "blueberry", "grape", "strawberry" };

  4. // List<string> query = fruits.Where(fruit => fruit.Length < 6).ToList();

  5. IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);

  6. foreach (string fruit in query)

  7. Console.WriteLine(fruit);


 

以上的两个例子呢,我觉得在平时编程中,还是会经常用到的,我们不妨试试。。。

 

做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口。这句话就告诉我们:IEnumerable,ICollection,IList,List区别了

首先我看看 IEnumerable:

复制代码

// 摘要:
    //     公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。
    //
    // 类型参数:
    //   T:
    //     要枚举的对象的类型。
    [TypeDependency("System.SZArrayHelper")]
    public interface IEnumerable<out T> : IEnumerable
    {
        // 摘要:
        //     返回一个循环访问集合的枚举器。
        //
        // 返回结果:
        //     可用于循环访问集合的 System.Collections.Generic.IEnumerator<T>。
        IEnumerator<T> GetEnumerator();
    }

复制代码

IEnumerable<T> 实现IEnumerable接口方法,那IEnumberable做什么的,其实就提高可以循环访问的集合。说白了就是一个迭代。

再来看看ICollection:

复制代码

    // 摘要:
    //     定义操作泛型集合的方法。
    //
    // 类型参数:
    //   T:
    //     集合中元素的类型。
    [TypeDependency("System.SZArrayHelper")]
    public interface ICollection<T> : IEnumerable<T>, IEnumerable
    

复制代码

原来ICollection<T> 同时继承IEnumerable<T>和IEnumerable两个接口,按我的理解就是,ICollection继续它们2个接口而且扩展了方法,功能强多了。
由原来的步枪变成半自动步枪

我们继续看IList:

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

 靠 IList 继承它们三个接口,怪不得功能这么多啊,那应该属于全自动步枪了

最后来看看List:

 

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

这个时候大家仔细看看,它们都是接口,只有List 是类,不仅实现它们的接口,而且还扩展了太多的方法给我利用。哇靠,几乎所有功能都能实现了,简直是激光步枪

按照功能排序:List<T> 《IList<T> 《ICollection<T>《IEnumerable<T>

按照性能排序:IEnumerable<T>《ICollection<T>《IList<T>《List<T>

那同学们,是不是可以根据自身的需求调用不能数组来实现功能,不要一味使用List,好了,送给一些不知道的同学们,大牛们,路过麻烦补充下,谢谢!

 

数据源不只是Ilist这样的,还可能是DataTable或者其他的 语言集成查询 (LINQ) 查询适用于实现 IEnumerable<(Of <(T>)>) 接口或 IQueryable 接口的数据源。DataTable 类不实现上述任何一个接口,因此您必须调用 AsEnumerable 方法来将 DataTable 用作 LINQ 查询的 From 子句中的源。 ICollection主要针对静态集合;IList主要针对动态集合 IEnumerable<T>继承自IEnumerable ICollection<T>继承自IEnumerable<T> IList<T>继承自ICollection<T> IEnumerable接口 实现了IEnumerable接口的集合表明该集合能够提供一个enumerator(枚举器)对象,支持当前的遍历集合。IEnumerable接口只有一个成员GetEnumerator()方法。 IList接口和ArrayList类的目的是实现动态数组,ArrayList是IList的一个实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值