IEnumerable和List有什么区别?(转)

如下

IList接口可以使用更多的方法。比如你看一个集合是否包含相应实体,IEnumerable不行,而IList里有Contains,相应的实现了IList的可以添加,删除相应实体。而IEnumerable不行。

但是这不是说IList就比IEnumerable好,就是因为IList实现的功能多,相对来说限制大了。你看Object,任何类都可用作Object,这就是因为他简单。同理,能为IList表达的数据集,一定能为IEnumerable表达,而能为IEnumerable表达不一定能为IList表达。你可以想想Linq To Object里的方法为什么是对IEnumerable接口了而不是选择IList接口。

性能对于我们来说不是问题,就算是问题,你问的性能是什么?是IEnumerable得到Current快还是什么的?

那么我想说,这是接口,他本身没有实现,怎么比较性能,就算有,也是List<T>之类的类才会有的。

public interface IEnumerable
{
     IEnumerator GetEnumerator();
}
public interface IEnumerator
{
    bool MoveNext();
    object Current { get; }
    void Reset();
}
public interface IList : ICollection, IEnumerable
{
    // Methods
    int Add(object value);
    void Clear();
    bool Contains(object value);
    int IndexOf(object value);
    void Insert(int index, object value);
    void Remove(object value);
    void RemoveAt(int index); // Properties
    bool IsFixedSize { get; }
    bool IsReadOnly { get; }
    object this[int index] { get; set; }
}

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

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

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

例如:

public static void Print(IEnumerable myList)
        {
            int i = 0;
            foreach (Object obj in myList)
            {
                if (obj is Student)//这个是类型的判断,这里Student是一个类或结构
                {
                    Student s=(Student)obj;
                    Console.WriteLine("\t[{0}]:\t{1}", i++, s.Sname);
                }
                if (obj is int)
                {
                    Console.WriteLine("INT:{0}",obj);
                }
            }
            Console.WriteLine();
        }

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

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

List<string> fruits =
                new List<string> { "apple", "passionfruit", "banana", "mango", 
                    "orange", "blueberry", "grape", "strawberry" };

// List<string> query = fruits.Where(fruit => fruit.Length < 6).ToList();
            IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
            foreach (string fruit in query)
                Console.WriteLine(fruit);

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

时间: 2024-08-03 15:42:23

IEnumerable和List有什么区别?(转)的相关文章

IEnumerable.Select和SelectMany的区别

IEnumerable<T>在Windows Phone 7的程序上很常用,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单迭代,下面主要分析一下 IEnumerable<T>.Select和IEnumerable<T>.SelectMany这两个方法的区别. IEnumerable<T>.Select  将序列中的每个元素投影到新表中. IEnumerable<T>.SelectMany 将序列的每个元素投影到 IEnume

IEnumerable&lt;T&gt;和IQueryable&lt;T&gt;区别

LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryable类,针对继承了IQueryable<T>接口的集合进行扩展.我们会发现接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,既然这样微软为什么要设计出两套扩展方法呢? 从LINQ查询功能上我们知道实际上可以分为三类:LINQ to OBJECT

MVC EF中IQueryable&lt;T&gt;,IEnumerable与list&lt;T&gt;的区别

IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution) IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库.前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性 IQueryable弊端:当把查询出来的数据,根据指定条件添加到其他表中时,会报连接以打开错误!原因:IQueryable在每次执行时都必须连接数据库读

[C#] IEnumerable vs IQueryable

这篇博客将介绍IEnumerable和IQueryable之间的区别. 1. IQueryable是继承自IEnumerable接口的.所以IEnumerable能做的,IQueryable都能做. 2. 先看代码,然后再讲两者之间的区别. using (NerdDinnerDataContext context = new NerdDinnerDataContext()) { IEnumerable<Dinner> dinners = context.Dinners; IEnumerable

IEnumerable IQueryable

LINQ2Object的处理结果是把LINQ表达式映射成对应的委托,而LINQ2SQL则是保存了一系列的"步骤"---表达式树的处理方式.两者的区别简单的理解就是LINQ2Object将数据存放在内存中.而LINQ2SQL则是把数据存放在远程的服务器中. .AsEnumerable() 和 .ToList() 的区别: .AsEnumerable()延迟执行,不会立即执行.当你调用.AsEnumerable()的时候,实际上什么都没有发生. . ToList()立即执行 当你需要操作结

Unity协程(Coroutine)原理深入剖析再续

Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine)的认识和理解,主要讲到了Unity引擎在执行协程(Coroutine)的原理(Unity协程(Coroutine)原理深入剖析)和对协程(Coroutine)状态的控制(Unity协程(Coroutine)管理类--TaskManager工具分享),到这使用Coroutine的疑问就没有了,但是D

C#语法之Linq查询基础一

Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都可以使用linq查询.不知道大家有没有想过为什么linq对这些都可以使用呢?统一的api适用这么多.其实主要还是IEnummerable<T>和IQueryable<T>两个接口.可能有人会问为什么是两个接口?这两个接口有什么区别或者联系呢?这又要引出来Enummerable.Quer

最新学习网址大全

log4j详细配置http://blog.csdn.net/andyfor/article/details/4437697LOG4NET用法(个人比较喜欢的用法)http://fanrsh.cnblogs.com/archive/2006/06/08/420546.htmlhttp://www.360doc.com/content/14/0924/12/1355383_411979610.shtmllog4net按照不同的[LEVEL]级别输出到不同文件http://blog.csdn.net/

.net 集合详解

IEnumerable接口和IEnumerator接口区别 1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如何实现迭代器(iterator).其代码实现为: public interface IEnumerable         {                IEnumerator GetEnumerator();          }    2. 而IEnumerator接口是实现式接口,它声明实现该接口的类就