2012-02-28 10 views
7

¿Por qué puedo usar la instrucción VBScript for each para iterar un objeto System.Collections.ArrayList, pero no un objeto Systems.Collections.SortedList?Dando sentido a IEnumerable en .Net COM Interop

Teniendo en cuenta lo siguiente:

set aList = Server.CreateObject("System.Collections.ArrayList") 
aList.Add "a" 
aList.Add "b" 
aList.Add "c" 
for each item in aList 
    ' do something 
next 

set sList = Server.CreateObject("System.Collections.SortedList") 
sList.Add "a", 1 
sList.Add "b", 2 
sList.Add "c", 3 
for each item in sList 
    ' do something 
next 

La línea

for each item in sList 

accidentes con

objeto no admite esta propiedad o método *.

Por esta propiedad supongo que significan la propiedad _NewEnum. Pero ¿por qué _NewEnum está expuesto por ArrayList, pero no SortedList? Ambas clases implementan la interfaz IEnumberable que desde el desmontaje mscorelib.dll parece ser la interfaz responsable de implementar la propiedad _NewEnum (dispId de -4).

Si alguien puede arrojar algo de luz sobre el comportamiento de interoperabilidad COM diferente de estas clases similares, estaría muy agradecido.

Sé que puedo usar otras propiedades expuestas por SortedList para iterar sobre la colección. No estoy preguntando cómo iterar un SortedList. Solo estoy preguntando por qué IEnumrable no parece implementarse en la versión de interoperabilidad de SortedList cuando se implementa en la versión de interoperabilidad de ArrayList.

Respuesta

3

Aunque SortedList implementa IEnumerable, tiene un método GetEnumerator() sobrecargado que devuelve IDictionaryEnumerator. Tienes que convertir explícitamente a IEnumerable para usar la sobrecarga que devuelve IEnumerator, que puede ser donde reside tu problema.

El enumerador predeterminado no tiene el mismo comportamiento que el de ArrayList: devolverá un DictionaryEntry para cada elemento en lugar de las cadenas que podría estar esperando.

Mi conjetura sería probablemente desee utilizar la propiedad Valores vez y que, si lo que la clasificación por los números, que desea utilizar los argumentos del método Agregar a la inversa, es decir

sList.Add 1, "a" 
Cuestiones relacionadas