Laden...

Eine List<T> erstellen und sofort mit Werten befüllen

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.299 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
Eine List<T> erstellen und sofort mit Werten befüllen

Hallo,

ich hab da eine Verständnisfrage.

Es wird eine List<string> erstellt, diese mit Werten befüllt. Warum aber ist sie nicht initialiisert, wenn ich folgenden Code benutze ?

 public List<string> GetFileContent(string filename)
{
 string line;
 List<string> returnValue = new List<string>({ "Output Value" });
 System.IO.StreamReader file = new System.IO.StreamReader(filename);
 while ((line = file.ReadLine()) != null)
    {
    returnValue.Add(line);
    }
  return returnValue;
}

setze ich jedoch in der Zeile


List<string> returnValue = new List<string>(new string[] { "Output Value" });

sei sie initialisiert.

Ich verstehe das Prinzip da hinter nicht. Sollte es denn nicht so sein,das ich durch das schlüsselwort new, eine neue List aus Strings erstelle - und diese von haus aus, eigentlich ein array sein sollten ?

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

naja - deine erste Variante passt schlicht zu keinem Konstruktor, den List<T> anbietet.

LG

Edit:
Kannst hier nachlesen:
https://msdn.microsoft.com/de-de/library/6sh2ey19(v=vs.110).aspx

Er will entweder:
a) Gar nichts
b) einen Enumerable des entsprechenden Typs (ein Array ist z.B. ein Enumerable)
c) einen int

C
10 Beiträge seit 2011
vor 5 Jahren

Oder du schreibst es so:

List<string> returnValue = new List<string>() { "Output Value", "bla", "blub" };

Stichwort: Auflistungsinitialisierer

PS: Ich würde hier ins Forum nur den unbedingt notwendigen Code posten 😉
Deine Frage bezieht sich nur auf eine einzige Zeile.
Alles andere verwirrt nur.

78 Beiträge seit 2016
vor 5 Jahren

Bezüglich:


List<string> returnValue = new List<string>({ "Output Value" });

... was für ein Compiler verwendest du? Das sollte eigentlich nicht mal kompilieren 🤔

http://dotnet-paderborn.azurewebsites.net/

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Visual Studio 2017 ?

Ach ja, stimmt, der code sah etwas anders aus, hab das beim editieren, vergessen wieder richtig zu stellen.

ich glaube das war vorher so...


List<string> returnValue = new List<string>{ "Output Value" };

C
224 Beiträge seit 2009
vor 5 Jahren

Ich vermute mal Du suchst die Split-Funktion.
Diese zerteilt die "Output Value" Zeichenfolge in ein Zeichenfolgenarray.


            string[] returnValue1 = "Output Value".Split(' ');
            List<string> returnValue2 = new List<string>(returnValue1);

            //bzw.
            List<string> returnValue3 = new List<string>("Output Value".Split(' ') );


C
2.121 Beiträge seit 2010
vor 5 Jahren

Eigentlich will er ja nur den einen String in der Liste haben, aber der Fantasie beim Vermuten sind keine Grenzen gesetzt 😃

C
10 Beiträge seit 2011
vor 5 Jahren

Genau, aber ich vermute mal weiter ^^

Er fragt sich bestimmt, warum das funktioniert:

string[] array = { "Hallo", "cya" };

Aber folgendes nicht:

var list = new List<string>({ "Hallo", "cya" });

Übrigens wäre das noch eine Alternative (nach new lässt sich string weglassen):

var lst = new List<string>(new []{ "Hallo", "cya" });

Aber ich favorisiere immer noch den Auflistungsinitialisierer (s. mein erster Beitrag in diesem Thread).

Syntaktisch ist's halt so, dass folgender Ausdruck nicht lose verwenden werden kann:

{ "Hallo", "cya" };

Man könnte sich fragen warum - das kann ich leider nicht beantworten.
Vielleicht möchten die Sprachdesigner eine Verwechslung mit anonymen Typen vermeiden.

Ich hatte mich seinerzeit auch gefragt, warum das nicht funktionierte:

string Test {get; set;} = ""

Und mit der nächsten C#-Version ging das dann 😃

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Huhu, also um das ganze etwas zu entmystifizieren. Der Anwendungsfall ist natürlich deutlich größer.

Unsere Firma, Flowster Solutions, hat eine eigene Automatisierungssoftware, in die man per drag und drop wie in einem flowchart - "Aktivitäten" zusammenstöpseln kann. Das sind dann einzelne kleinere Programme, genauergesagt DLLs auf C# basis.

In meinem Anwendungsfall hatte ich eine Anwendung zu schreiben, mit der man auf einer Remote Maschine ein Python Script ausführen kann und der Output an die Software zurückgegeben wird.

Speziell eine List aus Strings.

Im Prinzip wird Zeile für Zeile des Outputs (stdout, bzw. stderr) - als String der List hinzugefügt.

Warum das so sein soll, ist nicht meine Aufgabe - ich pass das ganze nur an.

Das war nur eine kurze Verständnisfrage, weil ich beim Coden darüber gestolpert bin. Ich bin kein Pro wie Abt, aber bin ja noch dabei...