IEnumerable和List有什么区别
答案:2 悬赏:0 手机版
解决时间 2021-02-01 10:10
- 提问者网友:山高云阔
- 2021-02-01 07:02
IEnumerable和List有什么区别
最佳答案
- 五星知识达人网友:春色三分
- 2021-02-01 08:00
如下.IList接口可以使用更多的方法.比如你看一个集合是否包含相应实体, IEnumerable不行,而
IList里有Contains,相应的实现了IList的可以添加,删除相应实体.而IEnumerable不行.
但是这不是说IList就比IEnumerable好,就是因为IList实现的功能多.相对来说限制大了,你看
Object.任何类都可用作Object.这就是因为他简单.同理.能为IList表达的数据集.一定能为IEnumerable表达.而能为IEnumerable表达不一定能为IList表达.你可以想想Linq To Object里的方法为什么是对IEnumerable接口了而不是选择IList接口.
性能对于我们来说不是问题.就算是问题.你问的性能是什么.是IEnumerable得到Current快还是什么的.
那么我想说,这是接口,他本身没有实现,怎么比较性能.就算有.也是List之类的类才会有的.
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; }
}
IList里有Contains,相应的实现了IList的可以添加,删除相应实体.而IEnumerable不行.
但是这不是说IList就比IEnumerable好,就是因为IList实现的功能多.相对来说限制大了,你看
Object.任何类都可用作Object.这就是因为他简单.同理.能为IList表达的数据集.一定能为IEnumerable表达.而能为IEnumerable表达不一定能为IList表达.你可以想想Linq To Object里的方法为什么是对IEnumerable接口了而不是选择IList接口.
性能对于我们来说不是问题.就算是问题.你问的性能是什么.是IEnumerable得到Current快还是什么的.
那么我想说,这是接口,他本身没有实现,怎么比较性能.就算有.也是List
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; }
}
全部回答
- 1楼网友:西风乍起
- 2021-02-01 08:59
两者区别有如下几点1、一个collection要支持foreach方式的遍历,必须实现ienumerable接口(亦即,必须以某种方式返回ienumerator object)。
2、ienumerator object具体实现了iterator(通过movenext(),reset(),current)。
3、从这两个接口的用词选择上,也可以看出其不同:ienumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);ienumerator是一个实现式的接口,ienumerator object就是一个iterator。
4、ienumerable和ienumerator通过ienumerable的getenumerator()方法建立了连接,client可以通过ienumerable的getenumerator()得到ienumerator object,在这个意义上,将getenumerator()看作ienumerator object的factory method也未尝不可。
ienumerator 是所有枚举数的基接口。
枚举数只允许读取集合中的数据。枚举数无法用于修改基础集合。
最初,枚举数被定位于集合中第一个元素的前面。reset 也将枚举数返回到此位置。在此位置,调用 current 会引发异常。因此,在读取 current 的值之前,必须调用 movenext 将枚举数提前到集合的第一个元素。
在调用 movenext 或 reset 之前,current 返回同一对象。movenext 将 current 设置为下一个元素。
在传递到集合的末尾之后,枚举数放在集合中最后一个元素后面,且调用 movenext 会返回 false。如果最后一次调用 movenext 返回 false,则调用 current 会引发异常。若要再次将 current 设置为集合的第一个元素,可以调用 reset,然后再调用 movenext。
只要集合保持不变,枚举数就将保持有效。如果对集合进行了更改(例如添加、修改或删除元素),则该枚举数将失效且不可恢复,并且下一次对 movenext 或 reset 的调用将引发 invalidoperationexception。如果在 movenext 和 current 之间修改集合,那么即使枚举数已经无效,current 也将返回它所设置成的元素。
枚举数没有对集合的独占访问权;因此,枚举一个集合在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯