Guten Morgen,
Ich möchtes den oben genannten Algorithmus in c# implementieren. Den pseudocode habe ich auf Wikipedia gefunden. Nachdem ich keine Lösung gefunden habe habe ich gegoogelt.
public static IEnumerable<IEnumerable<T>> Permute<T>(this IList<T> v)
{
ICollection<IList<T>> result = new List<IList<T>>();
Permute(v, v.Count, result);
return result;
}
private static void Permute<T>(IList<T> v, int n, ICollection<IList<T>> result)
{
if (n == 1)
{
result.Add(new List<T>(v));
}
else
{
for (var i = 0; i < n; i++)
{
Permute(v, n - 1, result);
Swap(v, n % 2 == 1 ? 0 : i, n - 1);
}
}
}
private static void Swap<T>(IList<T> v, int i, int j)
{
var t = v[i];
v[i] = v[j];
v[j] = t;
}
Könnte das vielleicht jemand Zeile für Zeile mit mir durchgehen? Ich verstehe nicht genau was es mit den typparametern auf sich hat. Es wirkt auf mich wie generics aber so ganz fällt der Groschen nicht. Irgendwie sitze ich einfach auf dem Schlauch was genau da passiert.
Kann mir jemand helfen?
Setze einen Breakpoint in der Erweiterungsfunktion Permute, dann erstelle eine Liste mit mehreren Elementen, rufe damit Permute auf und erfreue dich am Debugger, der alles Schritt für Schritt mit dir durchgeht.
Du hast die Methode „erweiterungsfunktion“ genannt. Ich dachte eigentlich es sei eine generische Methode? Oder eine generische Erweiterungsmethode also eine Kombination aus einer generischen Methode und einer Erweiterungsmethode. Stimmst du mir da zu oder ist mein Eindruck falsch?
Hallo Kikolo,
alle deiner Methoden sind generisch, zu erkennen am Typparameter T
. Zusätzlich ist die Methode public static IEnumerable<IEnumerable<T>> Permute<T>(this IList<T> v)
eine Erweiterungsmethode, zu erkennen am this
vor dem ersten Parameter. Das bedeutet, dass sie wie eine Methode des Typs, den du erweiterst (hier ILIst<T>
), aufgerufen werden kann. Weitere Informationen dazu findest du auch in der Doku https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods (Docs)
Evtl. wäre hier ein Studium der Grundlagen sehr hilfreich - ohne diese wirst du keine Freude an C# haben...
[FAQ] Wie finde ich den Einstieg in C#?
[Hinweis] Bitte schau in die SDK-/MSDN-Doku