2016-11-22 123 views
-1

正確!謝謝! 但我不明白如何使用foreach ... 目標是每次修改Num時修改列表。 用Canvas List和工作列表的方式是好的編碼好嗎?c#動態修改列表

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(); 
    } 
} 

感謝

+0

同樣的String.Format不打印,所以你必須做'Console.WriteLine(的String.Format(項目,i_StationNum,200); )' – Sid

+2

哇,4個答案後,仍然沒有答案告訴OP如何更改列表中的字符串。他們都只是告訴如何打印到控制檯。 –

回答

0

如果要修改現有的名單,你必須使用for循環,而不是foreach之一:

foreach (var item in list) ... 

應改爲

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

例如

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

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

當測試嘗試創建報告(把所有的邏輯到單個讀取查詢),然後打印出來在一個去

... 

    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

謝謝M.Bychenko!我有我的答案。 – Jablonovo

-1

這是因爲

String.Format(item, i_StationNum, 200) 

不更改列表中的字符串。

您必須將String.Format結果指定給您的項目。

0

無需重複foreach(第一個,對您的項目沒有任何作用)。試試這個:

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

你猜?我們不想在這裏猜測。我們需要推理的答案。 –

+0

我刪除了@ThomasWeller。問候 – RizkiDPrast

0

String.Format()返回一個字符串,它不會改變你正在格式化的任何東西。因此,您的第一個foreach (var item in genlnkPLC)會創建立即銷燬的臨時字符串。

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

在您不使用String.Format插入參數到的genlnkPLC成員,這顯然意在作爲格式字符串的聲明

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

。您可以使用

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

代替。

0

問題是,您無法更改在foreach循環中枚舉的元素的引用。 string是一個不可變對象,所以更改它會替換舊的引用。如果你想改變在列表中的元素,你需要做一個for循環,就像這樣:

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

感謝您的回答。我想畫布列表和工作列表是好的...我沒有看到其他方式改變列表清除擦除{0},所以它會工作一次,然後它會bugg。所以我想到了第二個列表改爲與它一起工作,第一個列表改變並保持{0}。 – Jablonovo

0

由於M.Bychenko說:「如果你想修改現有的列表,你必須使用循環而不是foreach:「

並感謝您的報告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(); 
    } 
}