C# Probleme mit Delegates

Chris_S04

Commander
Registriert
Mai 2011
Beiträge
2.419
Hallo,

ich bin neulich über ein Problem mit den Delegates in C# gestolpert. Und zwar habe ich einen generischen Datenpool, welcher in Form einer verketteten Liste vorliegt. Die ganzen Operationen mit dieser funktionieren soweit auch sehr gut, allerdings gibt es dann noch das Probelm, dass es eine Funktion voidForAll (FktDelegate f) gibt, welche für eine passende übergebene Funktion diese auf alle Elemente des Pools anwenden soll. Hierfür muss ein generisches Delegate FktDelegate mit einem generischen Eingangs- und Returnparameter definiert werden. Abschließend muss die ForAll-Methode aus einer anonymen Methode heraus aufgerufen werden, welche die Daten im Datenpool verändern soll (z.B. es stehen Integer in dieser Liste und diese sollen quadriert werden).
Und genau da liegt eben das Problem. Ich bin derzeit so weit:

class ListenElement<T>
{
public T _Wert;
public ListenElement<T> _Next;
}

class Queue<T> : IEnumerable
{
public ListenElement<T> _ListenAnfang = null;

public void Append(T _Value)
{
if (this._ListenAnfang == null)
{
this._ListenAnfang = new ListenElement<T>();
this._ListenAnfang._Wert = _Value;
}
else
{
ListenElement<T> Hangler = new ListenElement<T>();
Hangler = _ListenAnfang;
while (Hangler._Next != null)
{
Hangler = Hangler._Next;
}
Hangler._Next = new ListenElement<T>();
Hangler._Next._Wert = _Value;
}
}

public IEnumerator GetEnumerator()
{
ListenElement<T> Hangler = new ListenElement<T>();
Hangler = this._ListenAnfang;
while (Hangler._Next != null)
{
yield return Hangler;
Hangler = Hangler._Next;
}
}
}

delegate T FktDelegate<T>(T _Variable);

class Program
{
public void ForAll<T>(FktDelegate<T> _Del)
{
// leider kA, was hier zu tun ist
}

static void Main(string[] args)
{
Queue<int> Liste = new Queue<int>();
Liste.Append(1);
Liste.Append(2);
Liste.Append(3);

foreach (ListenElement<int> LE in Liste)
{
Console.WriteLine(LE._Wert);
}

// Nun müssen per Delegate und der anonymen Methode die zahlen der Queue noch quadriert werden
}
}

Nun habe ich wie gesagt leider keine Ahnung, wie ich mit diesem Delegate umzugehen habe, bzw. wie ich diese Aufgabenstellung per Delegate realisieren soll. Ich hoffe, dass ihr mir weiter helfen könnt. Schon einmal vielen Dank im Voraus für euere Mühe!

Mit freundlichen Grüßen

Chris_S04
 
Zuletzt bearbeitet:
Arbeite bitte an deiner Notation ^^ Da bluten einem die Augen :)
Siehe Code unten. Grade keine Lust den Lehrer zu spielen, aber:
  1. dein Code ist fehlerhaft.
  2. deine Namensgebung ist katastrophal.
  3. dein Queue ist kein Queue
  4. du solltest dir überlegen, ob es nicht besser wäre, ForAll(...) in Queue<T> zu implementieren.

Code:
public delegate T FktDelegate<T>( T arg );

public static class Program
{
    public static void ForAll<T>( this Queue<T> queue, FktDelegate<T> action )
    {
        foreach ( ListenElement<T> item in queue )
        {
            item._Wert = action.Invoke( item._Wert );
        }
    }

    public static void Main()
    {
        var queue = new Queue<int>();
        queue.Append( 1 );
        queue.Append( 2 );
        queue.Append( 3 );
        queue.Append( 4 );

        foreach ( ListenElement<int> le in queue )
            Console.WriteLine( le._Wert );

        queue.ForAll( ComputeSquare );

        foreach ( ListenElement<int> le in queue )
            Console.WriteLine( le._Wert );
    }

    private static int ComputeSquare( int x )
    {
        return x * x;
    }
}
 
OK vielen Dank. Allerdings drängen sich mir hier erneut Fragen auf.

1. Warum ist mein Code fehlerhaft? OK die GetEnumerator()-Methode ist falsch, stimmt, aber sonst?
2. Warum ist meine Namensgebung Katastrophal? Weil ich zwischen Deutsch und Englisch hin und her springe?
3. Warum sollte meine Queue keine Queue sein? Habe das leider so gelernt...
4. Die Sache mit ForAll war leider aus der Aufgabenstellung so vorgegeben
5. Verstehe ich den Zusammenhang zwischen Zeile 24 und der ForAll-Methode nicht. Wie kann queue.ForAll funktionieren, wenn diese Methode nicht in der Klasse Queue implementiert ist? und die Signatur der Methode ( this Queue<T> queue, FktDelegate<T> action ) kenne ich so leider auch nicht. Was genau bedeutet "this Queue<T> queue"? Bzw. was bewirkt es?
6. Die Aufgabe sollte laut Angabe mit einer anonymen Methode gelöst werden. Nach meinem Wissenstand ist das keine oder liege ich da falsch?

Tut mir Leid die vielen Fragen, aber da ich bin eben noch dabei das alles im Zuge des Studiums zu erlernen.
Und nochmals vielen Dank im Voraus.

Mit freundlichen Grüßen

Chris_S04
 
Zuletzt bearbeitet:
Chris_S04 schrieb:
OK vielen Dank. Allerdings drängen sich mir hier erneut Fragen auf.

1. Warum ist mein Code fehlerhaft? OK die GetEnumerator()-Methode ist falsch, stimmt, aber sonst?

Das war's :D

Chris_S04 schrieb:
2. Warum ist meine Namensgebung Katastrophal? Weil ich zwischen Deutsch und Englisch hin und her springe?

Das mit dem Deutsch/English ist mir nicht mal aufgefallen. Ich meine sowas:

Code:
public ListenElement<T> _ListenAnfang = null;
oder
Code:
this._ListenAnfang._Wert = _Value;

Keine Ahnung, wer es dir beigebracht hat, aber diese Schreibweise ist ein Mix aus so ziemlich allem was es gibt. OK, Hungarian fehlt :)

Chris_S04 schrieb:
3. Warum sollte meine Queue keine Queue sein? Habe das leider so gelernt...

Dann fehlt da aber noch was. Und nebenbei, ein Queue hat eine Methode Enqueue und Dequeue, aber kein Append :)

Chris_S04 schrieb:
4. Die Sache mit ForAll war leider aus der Aufgabenstellung so vorgegeben

Was möchtest du mir sagen?

Chris_S04 schrieb:
5. Verstehe ich den Zusammenhang zwischen Zeile 24 und der ForAll-Methode nicht. Wie kann queue.ForAll funktionieren, wenn diese Methode nicht in der Klasse Queue implementiert ist? und die Signatur der Methode ( this Queue<T> queue, FktDelegate<T> action ) kenne ich so leider auch nicht. Was genau bedeutet "this Queue<T> queue"? Bzw. was bewirkt es?

Das ist eine so genannte Extension Methode. Was es tut, sieht man ja, man kann eine Klasse erweitern (daher Extension) mit einer Methode, die ausserhalb der Klasse implementiert ist. Das "this Queue<T> queue" gibt dabei den Typen an, auf den die Methode angewended werden kann.

Chris_S04 schrieb:
6. Die Aufgabe sollte laut Angabe mit einer anonymen Methode gelöst werden. Nach meinem Wissenstand ist das keine oder liege ich da falsch?

Ich kenne deine Aufgabenstellung nicht wörtlich. Soll das Quadrat mit Hilfe einer anonymen Funktion berechnet werden oder nur der Aufruf für ForAll(...)?

Code:
// Method group
queue.ForAll( ComputeSquare );
// ist identisch zu 
// Lamba Funktion
queue.ForAll( q => ComputeSquare( q ) );

Falls es keine Funktion ComputeSquare geben soll:

Code:
// Oder direkt nur als Lambda
queue.ForAll( q => q * q );

Chris_S04 schrieb:
Tut mir Leid die vielen Fragen, aber da ich bin eben noch dabei das alles im Zuge des Studiums zu erlernen.
Und nochmals vielen Dank im Voraus.

Mit freundlichen Grüßen

Chris_S04


Kein Thema. Falls du ernsthaft Interesse an C# hast, kämpf dich mal durch die Microsoft Tutorials. Die sind relativ kurz und behandeln aber so ziemlich alles wissenswertes. Klick.

Viele Grüße
 
Zurück
Oben