2016-11-22 3 views
-1

Richtig! Vielen Dank! Aber ich verstehe nicht, wie es mit Foreach zu tun ist ... Das Ziel ist es, eine Liste jedes Mal zu ändern, wenn wir Num ändern. Ist der Weg mit einer Canvas-Liste und einer Arbeitsliste für gutes Codieren in Ordnung?C# dynamisch modifizierende Liste

class Program 
{ 
    static void Main(string[] args) 
    { 
     int i_Num = 0; 
     string Str_Num = ""; 
     string[] linkToPLC = {"toto[{0}].test{1}", "tata[{0}].test{1}", "titi[{0}].test{1}"}; 
     List<string> genlnkPLCCanvas = new List<string>(linkToPLC); 
     List<string> genlnkPLCworkingwith = new List<string>(linkToPLC); 

     Console.WriteLine("Insert Num: "); 
     Str_Num = Console.ReadLine(); 
     i_Num = Convert.ToInt32(Str_Num); 
     for (int item = 0; item < genlnkPLCCanvas.Count; item++) 
     { 
      genlnkPLCworkingwith[item] = String.Format(genlnkPLCworkingwith[item], i_Num, 200); 
      Console.WriteLine("with List: result= " + genlnkPLCworkingwith[item]); 
     } 
     //foreach (string item in genlnkPLCCanvas) genlnkPLCworkingwith[item] = String.Format(item, i_Num, 200); 
     Console.ReadKey(); 
    } 
} 

Dank

+0

Auch String.Format nicht so druckt Sie 'Console.WriteLine (String.Format (Artikel, i_StationNum, 200); ) zu tun haben' – Sid

+2

Wow, 4 Antworten später, immer noch keine Antworten erzählt die OP, wie Strings in der Liste geändert werden. Sie alle sagen nur, wie man in die Konsole druckt. –

Antwort

0

Wenn Sie die vorhandene Liste ändern möchten, müssen Sie for Schleife verwenden statt foreach ein:

foreach (var item in list) ... 

sollte in

for (int i = 0; i < list.Count; ++i) { 
    var item = list[i]; // not necessary, but often convenient 
    ... 
    list[i] = ... // modification 
    ... 
} 

Zum Beispiel

geändert werden
for (int i = 0; i < genlnkPLCCanvas.Count; ++i) { 
    var item = genlnkPLCCanvas[i]; 

    genlnkPLCCanvas[i] = string.Format(item, i_StationNum, 200); 
    } 

Beim Versuch Testen Erstellen von Berichten (setzen die gesamte Logik in die einzige lesbare Abfrage) und dann in man gehen Ausdrucken:

... 

    var withListReport = genlnkPLC 
    .Select(item => "with List: result = " + string.Format(item, i_StationNum, 200)); 

    var withoutListReport = genlnkPLC 
    .Select(item => "without List: result = " + string.Format(item, i_StationNum, 200)); 

    // now you can do whatever you want with the reports: 
    // - print them to console 
    //  Console.WriteLine(string.Join(Envrironment.NewLine, withListReport)); 
    // - save to file: 
    //  File.WriteAllLines(@"C:\MyFile.txt", withListReport); 
    // - print to, say, WinForm UI: 
    //  MyTextBox.Text = string.Join(Envrironment.NewLine, withListReport); 

    Console.WriteLine(string.Join(Envrironment.NewLine, withListReport)); 
    Console.WriteLine(string.Join(Envrironment.NewLine, withoutListReport)); 

    Console.ReadKey(); 
+0

Danke M.Bychenko! Ich hatte meine Antworten. – Jablonovo

-1

Dies liegt daran,

String.Format(item, i_StationNum, 200) 

in der Liste nicht die Zeichenkette ändern.

Sie müssen das String.Format Ergebnis Ihrem Artikel zuweisen.

0

Keine Notwendigkeit, foreach (der erste, hat nichts zu Ihrem Artikel) zu wiederholen. Versuchen Sie folgendes:

foreach (var item in genlnkPLC) 
    Console.WriteLine("with List: result= "+ String.Format(item, i_StationNum, 200)); 
+0

Sie raten? Wir wollen hier keine Vermutungen. Wir wollen Antworten mit Argumenten. –

+0

ich entfernte es @ThomasWeller. Grüße – RizkiDPrast

0

String.Format() einen String zurückgibt, ist es nicht zu ändern, was auch immer Sie die Formatierung. Daher erstellt Ihre erste foreach (var item in genlnkPLC) temporäre Zeichenfolgen, die sofort zerstört werden.

foreach (var item in genlnkPLC) 
{ 
    Console.WriteLine("with List = " + String.Format(item, i_StationNum, 200)); 
} 
0

In der Erklärung

foreach (var item in genlnkPLC) 
    Console.WriteLine("with List: result= "+item); 

Sie nicht String.Format verwenden Argumente in die Mitglieder der genlnkPLC einzufügen, die offenbar als Format-Strings bestimmt sind. Sie können stattdessen

foreach (var item in genlnkPLC) 
    Console.WriteLine("without List result = " + String.Format(item, i_StationNum, 200)); 

verwenden.

0

Das Problem ist, dass Sie die Referenz der Elemente in einer foreach Schleife nicht ändern können. string ist ein unveränderbares Objekt. Wenn Sie es also ändern, wird die alte Referenz durch eine neue ersetzt. Wenn Sie die Elemente in der Liste ändern möchten, müssen Sie es in einer for Schleife tun, wie folgt aus:

for (int item = 0; item < genlnkPLC.Count; item++) 
      genlnkPLC[item]= String.Format(genlnkPLC[item], i_StationNum, 200); 
+0

Danke für Ihre Antwort. Ich denke, dass die Canvas-Liste und die Arbeitsliste in Ordnung sind ... Ich sehe keine andere Möglichkeit, die Liste zu ändern, ohne die {0} zu löschen, so dass sie einmal funktioniert und dann wird sie bugg. Also dachte ich über eine zweite Liste nach, die geändert wurde, um damit zu arbeiten und eine erste Liste, die sich ändert und die {0} behält. – Jablonovo

0

Wie M.Bychenko sagt: „Wenn Wenn Sie die bestehende Liste ändern möchten, müssen Sie for for Schleife anstelle von foreach verwenden: "

Und danke für den Bericht tipp!

class Program 
{ 
    static void Main(string[] args) 
    { 
     int i_Num = 0; 
     string Str_Num = ""; 
     string[] linkToPLC = {"toto[{0}].test{1}", "tata[{0}].test{1}", "titi[{0}].test{1}"}; 
     List<string> genlnkPLCCanvas = new List<string>(linkToPLC); 
     List<string> genlnkPLCworkingwith = new List<string>(linkToPLC); 

     Console.WriteLine("Insert Num: "); 
     Str_Num = Console.ReadLine(); 
     i_Num = Convert.ToInt32(Str_Num); 
     for (int item = 0; item < genlnkPLCCanvas.Count; item++) 
     { 
      genlnkPLCworkingwith[item] = String.Format(genlnkPLCCanvas[item], i_Num, 200); 
     } 
     var CanvasListReport = genlnkPLCCanvas.Select(item => "Canvas List = " + item); 
     var WorkingListReport = genlnkPLCworkingwith.Select(item => "Working list = " + item);//string.Format(item, i_Num, 200)); 
     // now you can do whatever you want with the reports: 
     // - print them to console 
     //  Console.WriteLine(string.Join(Envrironment.NewLine, withListReport)); 
     // - save to file: File.WriteAllLines(@"C:\MyFile.txt", withListReport); 
     // - print to, say, WinForm UI: 
     //  MyTextBox.Text = string.Join(Envrironment.NewLine, withListReport) 
     Console.WriteLine(string.Join(Environment.NewLine, CanvasListReport)); 
     Console.WriteLine(string.Join(Environment.NewLine, WorkingListReport)); 
     Console.ReadKey(); 
    } 
}