Forum: PC-Programmierung C# Array mit beliebigem Rank an Methode übergeben


von fop (Gast)


Lesenswert?

Ich habe hier eine Methode, der ich gerne ein Array von Werten des Typs 
Double übergeben möchte.
Prinzipiell sind dabei Ranks von 1 bis 255 möglich und unter Umständen 
auch sinnvoll ;-)
Ist das Array erstmal in der Methode angekommen, könnte ich ja mit Hilfe 
von Arrayname.Rank die Anzahl der Dimensionen bestimmen.
Aber, C# läßt mich immer nur eine in der Parameterliste festgelegte 
Anzahl von Ranks übergeben.
Ich kann die Methode natürlich überladen, was bei der Anzahl an 
Möglichkeiten aber schon ziemlich uncool kommt.
Wie geht es richtig ?

von Michael (Gast)


Lesenswert?

Nutze einfach einen Parameter vom Typ System.Array .

von Syntax Error (Gast)


Lesenswert?

fop schrieb:
> Wie geht es richtig ?

Mit einer richtigen Programmiersprache? C# ist was für Spielkinder.

von Egon D. (Gast)


Lesenswert?

fop schrieb:

> Prinzipiell sind dabei Ranks von 1 bis 255
> möglich und unter Umständen auch sinnvoll ;-)

Der Rang einer Matrix ("Rank") ist die (maximale)
Anzahl linear unabhängiger Zeilen bzw. Spalten.

Ist das wirklich gemeint?

von fop (Gast)


Lesenswert?

So, ich habe es jetzt mit System.Array umgesetzt. Nun gut, jetzt erfolgt 
die Prüfung des Typs zur Laufzeit statt zur Compilierzeit, aber es 
funktioniert.

Die Eigenschaft "Rank" eines Array bei C#, wird von Microsoft zwar auch 
mit Rang übersetzt, gibt jedoch vermutlich etwas ganz anderes an, als 
den Rang einer Matrix. Ich habe nur den Anfang der Erklärung von "linear 
unabhängig" gelesen und denke, dass es mir um etwas wesentlich 
Einfacheres geht.

Es geht um die Dimensionen des Array, also wieviele Indizes muss ich 
angeben, um ein Element zu adressieren.

von Keiner N. (nichtgast)


Lesenswert?

Jetzt wirds wirklich mal Zeit für ein wenig Code um darzustellen, was du 
machen wilst.

Array.Rank gibt dir die Anzahl der Dimensionen zurück, die dein Array 
hat.

also bei

var foo = new Array[3,2]
var bar = new Array[5]

bekommst du für foo.Rank  eine 2 zurück und bei bar eine 1

: Bearbeitet durch User
von Michael (Gast)


Lesenswert?

fop schrieb:
> So, ich habe es jetzt mit System.Array umgesetzt. Nun gut, jetzt erfolgt
> die Prüfung des Typs zur Laufzeit statt zur Compilierzeit, aber es
> funktioniert.

Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .

von fop (Gast)


Lesenswert?

> Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .

Klingt erstmal gut. Leider meint der Compiler dazu :

Fehler Typ 'System.Array' ist nicht generisch und kann daher nicht mit 
Typargumenten verwendet werden.

Beitrag #5929407 wurde vom Autor gelöscht.
von Keiner N. (nichtgast)


Lesenswert?

fop schrieb:
>> Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .
>
> Klingt erstmal gut. Leider meint der Compiler dazu :
>
> Fehler Typ 'System.Array' ist nicht generisch und kann daher nicht mit
> Typargumenten verwendet werden.

Die generischen Typen sind in System.Collection.Generic drin. Aber da 
gibts aber kein Array.

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DEN-US%26k%3Dk(System.Collections.Generic);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.7.2);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.8


Wenn man solche Klimmzüge machen muss, sollte man sich immer überlegen, 
ob das Design etwas taugt.

: Bearbeitet durch User
von Torben (Gast)


Lesenswert?

List<T> sollte doch gehen und kannst du genauso wie ein Array  über 
Index zugreifen

von fop (Gast)


Lesenswert?

Torben schrieb:
> List<T> sollte doch gehen und kannst du genauso wie ein Array  über
> Index zugreifen

Jo, aber nur eindimensionale.

von Yarra (Gast)


Lesenswert?

Ich frage mich gerade wie du die 255 Dimensionen deklarierst und 
initialisierst. Sind die Dimensionen alle gleich groß?

Grüße Yarra

von Alex G. (dragongamer)


Lesenswert?

Also ich hätte das gleich mit einem Struct gelöst welches das 
individuell dimensionale Array enthält.
Gut möglich dass dies sogar etwas sauberer aussehen würde, da die 
wahrscheinlichkeit hoch ist, dass man die ein oder andere Funktion 
dazuschreiben kann die dieses Array verarbeitet. Eventuell ermöglich 
dies sogar das eher unhandlich anmutende Array sogar komplett von 
anderen Klassen abzukapseln.

Das ist nur dann die schlechtere Lösung wenn es aufs letzte bisschen 
Performance ankommt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.