2009-09-23 83 views
1

我想知道我是否可以假设我从IList(通过调用IEnumerable接口中的GetEnumerator方法)得到的IEnumerator将按列表顺序给出项目。应如何处理.Net IList的枚举?

您认为如何?

回答

8

您不能,因为IList是一个接口,并且实现可以按任意顺序枚举项目。例如,我可以实现WeirdList:IList,并以任何方式枚举项目,包括非确定性项目。另一方面,如果您使用列表(T),它将保证按列表中存储的顺序枚举项目。

编辑:就像其他人指出的那样,大多数实现都遵循List(T)的语义。虽然这不是你问的;)

+1

+1大多数实现都是相似的,但基于这个事实编写代码将是一个巨大的错误。 – 2009-09-23 13:57:09

+0

我会对代码尝试验证具有相当强硬语义的数据结构的语义。这对您的单元测试是可以的,以确保MyListImpl匹配IList所暗示的内容,但实际的生产代码不应该有这些检查。 – user7116 2009-09-23 14:04:16

0

是的,它至少会对IList的体面实施做到这一点。一个好的IList应该总是按照与列表索引相同的顺序枚举它的元素。

List<int> list = new List<int> { 1, 1, 2, 3, 5, 8 }; 

IEnumerator<int> enumtor = list.GetEnumerator(); 
while (enumtor.MoveNext()) 
{ 
    Console.Write(enumtor.Current); 
} 

打印112358

+0

实施现在有办法保证谁实施的IList的人遵循了这一原则,也有一些例子,其中这将是有意义的,为了不归还。 – 2009-09-23 13:44:28

+1

没有保证,但这是一个普遍有效的假设,它被认为是一个有效的假设。 – Joren 2009-09-23 13:46:37

+0

我同意它应该是一个有效的假设,但经验告诉我,程序员有时会在他们的代码中做疯狂的事情:) – 2009-09-23 13:50:51

0

枚举器应该让你访问列表中的对象相对于它们在内存中的位置,这将与使用列表的索引器从0到长度< 1在for循环中。

编辑︰我专门回答了实现IList的.NET框架类,如果任何其他人实现这些接口,他们的实际实现可能几乎任何东西。所以这取决于实施者。

0

这将取决于与IList