GetEnumerator Problem

NRFi

Erfahrenes Mitglied
Hallo auch.
ich habe eine Klasse, die eine SortedList enthält (nicht an meine Klasse vererbt). In diese Liste werden Items geadded. Nennen wir diese Klasse mal a. a kann also objekte von klasse b bekommen.

Jetzt versuche ich, mit foreach die sachen abzurufen:

foreach (b bObjekte in aKlasse)
{

}

das geht schon mal gar nicht.
dann habe ich in Klasse a IEnumerable mit GetEnumerator implementiert und gebe in dieser Funktion den IEnumerator von der SortedList zurück. Ich dachte, das braucht er, damit das mit foreach geht, aber das geht auch nicht. Ich hab jetzt die Fehlermeldung vergessen :(

Also nochmal:

Code:
class a : IEnumerable
{
     SortedList _colList;
     
     a()
     {
          _colList = new SortedList();
     }

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

     public void add(b bla)
     {
           _colList.add(b.pseudokeykeineahnung, b);
     }
}

class b
{
property pseudokeykeineahnung; ...
}

//und jetzt halt

foreach (b bla in a)
{

}

//geht leider nicht
das da oben ist etwas pseudocode, also es gab keine Syntaxfehler, noch Fehler wegen einer Falschen IEnumerable-Implementierung.

Hat jemand ne Ahnung, warum das nicht geht?

Gruß, NRF
 
Eine SortedList Klasse gibt als Enumerator die IDictionaryEnumerator Schnittstelle und
nicht die IEnumerator Schnittstelle zurück.
Daher der Fehler.
 
hey, danke für den Tipp,

wie kann ich das denn umgehen? kann ich das beim return von GetEnumerator casten?
 
Casten kannst du zwar schon, jedoch ist der IEnumerator dann unbrauchbar,
da die Informationen aus der IDictionaryEnumerator Schnittstelle verloren gehen.
Wenn du nicht notwendiger Weise eine Schlüssel-Wert-Paar Auflistung brauchst, dann
nimm ein ArrayList Objekt.
Ansonsten muss du die Werte mittels IDictionaryEnumerator und nicht mit der foreach-Anweisung
durchlaufen.
 
Na, wer wird denn gleich aufgeben ;-)

Code:
public class ClassA : IEnumerable
{
	SortedList _colList;

	public ClassA()
	{
		_colList = new SortedList();
	}

	public IEnumerator GetEnumerator()
	{
		return new MyEnumerator(_colList.GetEnumerator());
	}

	public void add(ClassB bla)
	{
		_colList.Add(bla.pseudokeykeineahnung, bla);
	}

	private class MyEnumerator : IEnumerator
	{
		private IDictionaryEnumerator m_DictionaryEnumerator;

		public MyEnumerator(IDictionaryEnumerator dictEnum)
		{
			m_DictionaryEnumerator = dictEnum;
		}

		#region IEnumerator Member
		public void Reset()
		{
			m_DictionaryEnumerator.Reset();
		}
		public object Current
		{
			get	{ return m_DictionaryEnumerator.Value; }
		}
		public bool MoveNext()
		{
			return m_DictionaryEnumerator.MoveNext();
		}
		#endregion
	}
}

public class ClassB
{
	private string m_Dummy;

	public ClassB(string someText)
	{
		m_Dummy = someText;
	}

	public string pseudokeykeineahnung
	{
		get { return m_Dummy; }
	}
}

// using foreach
ClassB b1 = new ClassB("string1");
ClassB b2 = new ClassB("string2");

ClassA a = new ClassA();
a.add(b1);
a.add(b2);

foreach(ClassB b in a)
{
	MessageBox.Show(b.pseudokeykeineahnung);
}

Viel Spaß damit.
 
perfekt! :p
ich habs jetzt zwar noch nicht ausprobiert, aber ich schätze, dass es so gehen wird. danke nochmal :)
 

Neue Beiträge

Zurück