Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.05.2014, 17:24

[C#, Basics] Wie kann ich einen String mit einer erst zur Laufzeit definierten Anzahl von Variablen ausgeben?

Hallo zusammen!
Hier also mein erster Hilferuf an die Gemeinschaft.

Die Problemstellung: Ich möchte für ein Consolenprogramm eine allgemeine Methode zur Ausgabe eines Strings mit Platzhaltern erstellen. Die Anzahl der in den String zu integrierenden Variablen soll allerdings immer unterschiedlich sein können! (Selbstredend muss Anzahl der Platzhalter == Anzahl der Variablen sein.)

Zur Verdeutlichung, im Prinzip etwas in dieser Art:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
string text = "Hier soll der erste Wert stehen: {0} und hier der zweite: {1}"; // oder eben alternativ ein Text mit mehr als zwei Platzhaltern...
int zahl1 = 10;
int zahl2 = 20;

Ausgabe(text, zahl2, zahl2);  // ... die dann mit der passenden Anzahl von Integerwerten gefüllt werden.

public void Ausgabe(string ausgabetext, params int[] werte)
{
Console.WriteLine(ausgabetext, //.... TJA, UND HIER LIEGT DER HASE IM PFEFFER!
}


Wenig überraschend wird das Array werte nicht akzeptiert. Gibt es dennoch eine Möglichkeit, dieses Vorhaben umzusetzen? Wie sähe das Snippet aus, dass mir eine Anzahl von werte.GetLength() Elementen in den ausgabetext integriert?

Ich meine, dass ich in irgend einem Beispiel auf der MSDN-Seite so etwas mal gesehen habe. Es ging dort allerdings eigentlich um irgend etwas ganz anderes und ich kann den betreffenden Eintrag beim besten Willen nicht mehr finden. Aber vielleicht irre ich mich ja auch und das Beispiel hat mit einer festgelegten Anzahl Variablen gearbeitet. Diese Implementierung wäre dann freilich vollkommen klar und niemand muss sich hier die Mühe einer exemplarischen Antwort machen...

Ich würde mich über eine hilfreiche Antwort freuen und hoffe dabei, euch mit derartigen Anfängerfragen nicht zu sehr zu langweilen.

Matthias

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

25.05.2014, 18:04

So eine Funktion gibt es doch schon: Console.WriteLine

3

25.05.2014, 18:32

Sorry, Sylence, anscheinend habe ich mich nicht klar genug ausgedrückt.

Selbstverständlich gibt es diese Funktion. Genau die will ich doch nutzen. Nur dass ich halt eine Möglichkeit suche, eine Ausgabe in dieser Art:

Console.WriteLine("Text {0} und {1} ...bis {n}", variable_1, variable_2,...variable_n);

zu erreichen. Dabei soll n eben unterschiedliche Werte annehmen können.

Schon klar, dass dafür irgend eine Art von Umweg nötig sein dürfte. Die Frage ist halt, ob es den überhaupt gibt, oder ob es einfach nicht funktionieren kann.

Falls nicht, besteht natürlich immer noch die triviale Möglichkeit, zum Beispiel in einer switch-Anweisung n abzufragen und entsprechend die Richtige WriteLine-Zeile (mit der richtigen Anzahl von variablen hinter dem text) auszuführen. Schließlich benötige ich die Methode nur für mein eigenes Programm und kann selbst entscheiden, wie groß dieses n denn werden wird.

Aber das ist halt fürchterlich... unelegant.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deggial« (25.05.2014, 18:39)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

25.05.2014, 18:32

Console.WriteLine("Text {0} und {1} ...bis {n}", variable_1, variable_2,...variable_n);


Da hast du doch deine Möglichkeit? GENAU der Code macht das, was du willst O.o
Und genau das hab ich auch verlinkt.

5

25.05.2014, 18:44

Ich glaube du meinst eher, wie du die Variadic Arguments deiner Funktion der WriteLine Funktion übergeben kannst.

Du kannst ganz einfach das params-Array passen, in der Annahme, dass es gleichen Datentyp hat.

C#-Quelltext

1
2
3
4
5
6
public void Ausgabe(string text, params object[] varargs)
{
    Console.WriteLine(text, varargs);
}

Ausgabe("First Value: {0}, Second Value: {1}, and some other crap: {2}", val1, 5678, "dafuq");
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

6

25.05.2014, 18:45

War zu spät mit meinem edit.

Wie groß 'n' ist, soll eben erst zur Laufzeit festgelegt werden, damit die Methode flexibel auf eine unterschiedliche Zahl von Variablen reagieren kann. Wie in meine obige Nachricht reineditiert, ist mir schon klar, dass ich auch den uneleganten Weg gehen kann und unterschiedliche WriteLine-Anweisungen aufrufen kann, je nach n. Aber damit lege ich mich auch fest, dass n nie einen Wert überschreiten darf.

Das wäre okay, weil ich die Methode nur im Rahmen meines Programms aufgerufen werden soll und ich dort die Kontrolle habe. Aber das ist halt unelegant und widerspricht einer Wiederverwertung in anderen Programmen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

25.05.2014, 18:47

Zum zusammensetzen von Strings gibt es in C++ den stringstream.

edit: Unsinn, habe mich im Titel verlesen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (25.05.2014, 20:50)


8

25.05.2014, 18:48

@iSmokiieZz:

Ist dem so? Also ich hatte einen schnellen Test gemacht und ein Array wurde nicht als Parameter akzeptiert. Oder liegt der Zauber darin, ein Object als Typ zu verwenden? Ich habe es mit einem Integer-Array versucht.

Edit: Und in Deinem Beispiel verwendest Du ja auch eine vorher genau definierte Anzahl an Variablen (nämlich 3).

@NachoMan: Ich versuche, mich gerade als blutiger Anfänger in C# einzuarbeiten. Ich fürchte, C++ ist mir zu fremd und hilft mir leider nicht weiter.

9

25.05.2014, 18:51

Zitat

Ist dem so? Also ich hatte einen schnellen Test gemacht und ein Array wurde nicht als Parameter akzeptiert. Oder liegt der Zauber darin, ein Object als Typ zu verwenden? Ich habe es mit einem Integer-Array versucht.


Ich hatte doch geschrieben, dass die Datentypen gleich sein müssen?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

25.05.2014, 18:52

Anstatt mehrere Parameter entgegenzunehmen solltest du, wie im Stringstream, mit aufeinanderfolgenden Methodenaufrufen arbeiten. Das ist dann wirklich flexibel, weil man sogar Schleifen nutzen kann.
Verschiedene Datentypen sind so natürlich auch möglich.

edit: Unsinn, habe mich im Titel verlesen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (25.05.2014, 20:50)


Werbeanzeige