Avatar billede Mikker Praktikant
04. november 2006 - 23:48 Der er 7 kommentarer og
1 løsning

Enumeration, GetEnumerator, C#

Hej Eksperter

Jeg har ret svært ved at forstå idé'en i 'Enumeration' generelt. Jeg kan forstå at det er en teknik .NET bruger til at iterere igennem en collection (?) - men hvorfor og hvordan kan jeg ikke lige gennemskue. Og så tænkte jeg at der måske var en herinde der kunne forklare dette.

Jeg kan f.eks. ikke finde ud af hvad metoden GetEnumerator(), i nedenstående kode, skal indeholde. P.t. kaster den jo bare en Exception. Så hvordan får jeg den til at iterere igennem en ArrayList i en Generic class?

public class MyList<T> : IEnumerable
{
private ArrayList _innerList = new ArrayList();

public void Add(T val)
{
_innerList.Add(val);
}

#region IEnumerable Members

public IEnumerator GetEnumerator()
{
throw new Exception("The method or operation is not implemented.");
}

#endregion
}

class Program
{
static void Main(string[] args)
{
MyList<int> myIntList = new MyList<int>();
myIntList.Add(1);
myIntList.Add(2);
myIntList.Add(3);

foreach (int i in myIntList)
{
Console.WriteLine(i);
}

Console.ReadKey();
}
Avatar billede arne_v Ekspert
05. november 2006 - 00:26 #1
public IEnumerator<T> GetEnumerator()
{
    return _innerList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
    return _innerList.GetEnumerator();
}

synes at compile
Avatar billede arne_v Ekspert
05. november 2006 - 00:26 #2
(med diverse andre rettelser i koden)
Avatar billede Mikker Praktikant
05. november 2006 - 01:08 #3
Ahh, det var jo simpelt.

Nu virker det så, men der er noget jeg ikke helt forstår. Måske kan du forklare mig det:
myIntList.Add() indsætter en integer i den private ArrayList _innerList, og det er jo fint. Disse værdier/integers kan jeg så få ud direkte med f.eks.:
Console.Writeline(myIntList[0]); - men hvorfor kan jeg det uden at angive ArrayListens navn (_innerList)?
Avatar billede arne_v Ekspert
05. november 2006 - 01:12 #4
det kræver at du har en indexer i din klasse
Avatar billede Mikker Praktikant
05. november 2006 - 01:18 #5
Men det virker fint med Console.Writeline(myIntList[0]); Spørgsmålet er hvorfor. Jeg fortæller jo ikke klassen at jeg vil have værdien ud af _innerList.

Det gør ingen forskel om jeg tilføjer:

public T this[int index]
        {
            get
            {
                return (T)_innerList[index];
            }
        }
Avatar billede arne_v Ekspert
05. november 2006 - 01:58 #6
med min compiler, så compiler det ikke uden den indexer !
Avatar billede Mikker Praktikant
06. november 2006 - 12:26 #7
Jeg har fundet ud af at det virker fordi at GetEnumerator returnere en enumerator fra _innerlist.

public IEnumerator GetEnumerator()
{
    return _innerList.GetEnumerator();           
}

Tusind tak for hjælpen. smid et svar.
Avatar billede arne_v Ekspert
06. november 2006 - 13:13 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester