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 ?
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
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.
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/
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" };
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(' ') );
Eigentlich will er ja nur den einen String in der Liste haben, aber der Fantasie beim Vermuten sind keine Grenzen gesetzt 😃
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 😃
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...