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

11

25.05.2014, 19:02

... mit aufeinanderfolgenden Methodenaufrufen arbeiten.


Hm, das wäre freilich schade. Ich hatte auf raffiniertere Lösungen gehofft.

Hmmm... Idee:

Ich kann den Eingabe-String natürlich auch nach geschweiften Klammern (oder, mit dieser Methode, auch nach jedem anderen exotischen Zeichen, das ich mir ausdenke) absuchen, ihn entsprechend in Einzelstrings teilen und jeden Teil-String dann in einer einzelnen WriteLine-Anweisung mit genau einer Variable an den String angehängt ausgeben. Das Variablen-Array lässt sich dann wirklich einfach durchlaufen.

Prima, ich bin sicher, so gehts.


Falls es noch andere Möglichkeiten gibt: Bitte weiter hier mitteilen!

Danke für eure Antworten, Leute! :)

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

12

25.05.2014, 19:18

String.Format
Genau das was du suchst

13

25.05.2014, 20:28

Vorerst: Einer Methode mit params ist es egal, ob Du mehrere Parameter benutzt, oder tatsächlich einen Array übergibst. Deshalb machen folgenden zwei Aufrufe das gleiche:

C#-Quelltext

1
2
Console.WriteLine("{0},{1}", 1, 2 );
Console.WriteLine("{0},{1}", new object[] { 1, 2 });


Aber die Signatur (die Typen) muss natürlich stimmen, deshalb klappts auch nicht mit Deinem int-Array. Abhilfe schafft etwas LINQ.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
{
    Ausgabe("eins:{0}", 1);
    Ausgabe("zwei:{0},{1}", 1,2);
    Ausgabe("drei:{0},{1},{2}", 1, 2, 3);
}
static void Ausgabe(string text, params int[] werte)
{
    Console.WriteLine(string.Format(text, werte.Cast<object>().ToArray())); 
}


Cast sorgt hier für die Umwandlung in object (boxing, pro element). Das gibt dann leider erst mal nur einen IEnumerable<object>. ToArray() macht wieder einen Array draus.

Weiss jetzt nicht ob das viel weiterhilft, aber ein Blick auf LINQ und diese sogenannten extension methods ist für solche Sachen lohnenswert.

14

25.05.2014, 20:31

Ich habe, entsprechend meiner oben geschilderten Idee, mal ein schnelles Programm zusammengehackt, damit deutlich wird, was ich mir eigentlich vorgestellt habe.
Ich vermute, es gibt da viel eleganteren und schnelleren Code. Ich hoffe, ich habe mich mit meinem Versuch hier nicht lächerlich gemacht... Bitte, lasst es mich wissen!
Ich bin, wie gesagt, ganz neu in der Welt des C# und noch auf der Suche! ;-)

Die geschweiften Klammern sind eigentlich vollkommen unnötig und verkomplizieren die Sache im Grunde nur. Ich habe sie dennoch als Marker beibehalten, damit meine Methode analog zum klassischen WriteLine-Aufruf funktioniert.

Mein Beispielprogramm:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Als erstes ein Beispiel mit zwei übergebenen Variablen.
            string text = "Der erste Wert: {0} und auch der zweite: {1}."; 
            int variable1 = 10;
            int variable2 = 20;

            Ausgabe(text, variable1, variable2);

            // Und nun mit dreien.
            text = "Und auch mit {0} Werten geht es prima! Der {1}. Wert und nun der {2}. Wert. SO dachte ich mir das! :-)";
            variable1 = 3;
            variable2 = 2;
            int variable3 = 3;

            Ausgabe(text, variable1, variable2, variable3);
        }

        public static void Ausgabe(string text, params int[] variable)
        {
            int cutIn;
            int cutOut;
            string[] substring = new string[variable.Length];

            // Diese Schleife durchläuft den Text, sucht geschweifte Klammern und zerschneidet den Text entsprechend in kleine Häppchen
            for (int i = 0; i < variable.Length; i++)
            {
                cutIn = text.IndexOf("{"); // Finde das Ende des ersten Textteiles
                cutOut = text.IndexOf("}"); // und auch die darauf folgende schließende Klammer

                substring[i] = text.Substring(0, cutIn); // speichert en ersten Textteil
                text = text.Remove(0, cutOut + 1);     // und löscht bis zum Klammerausdruck.
            }

            string ausgabe = "";
 
           // Nun wird der Text wieder zussammengefügt, wobei jeweils die Variablen "dazwischengeschoben" werden.
            for (int i = 0; i < variable.Length; i++)
            {
                ausgabe += substring[i];
                ausgabe += variable[i];
            }
            ausgabe += text; // Hängt den übrig gebliebenen Text wieder an.

            Console.SetCursorPosition(0,2);
            Console.WriteLine("--------------------------");
            Console.WriteLine(ausgabe);
            Console.WriteLine("--------------------------");
            Console.ReadLine();
            Console.Clear();
        }

    }
}


______

Edit: LOL!!!

@unbird:

Vielen, vielen Dank! Das ist nun GENAU was ich meinte.... Eine kurze, elegante Zeile... anstelle meines super umständlichen Codes. *Seufz*

In der Tat, LINQ stand bisher noch nicht auf meinem Stundenplan. Kommt noch, ganz logisch!

Das Dumme an diesen Fingerübungen ist halt, dass immer wieder Probleme auftauchen, die zu lösen meine Kenntnisse einfach noch nicht reichen. Was nichts daran ändert, dass sie jucken und ich mich kratzen muss.
Vielen lieben Dank, dass Du mir dafür ein Stöckchen gegeben hast!

PROBLEM GELÖST!

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Deggial« (25.05.2014, 20:58)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

15

25.05.2014, 20:49

Ach tut mir leid, ich habe C++ gelesen. xD
"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?

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

16

25.05.2014, 21:17

Wie gesagt. String.Format xD

17

25.05.2014, 21:39

Ein impliziter cast sollte es auch tun. Für Quelltext siehe den post, den ich schon letzte Seite gepostet habe.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

18

25.05.2014, 22:10

@iSmokiieZz:

Ooops, da hast Du volkommen Recht! In der Tat ist der cast der Knackpunkt, das Integer-Array in meinem Test ging, wie gesagt nicht. Bitte verzeih, ich wollte Deine Lösung nicht ignorieren - ich hab's einfach nicht verstanden.


Tatsächlich ist Deine Variante noch einfacher/eleganter. Vielen lieben Dank also auch Dir!

Werbeanzeige