2016-11-22 91 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(); 
    } 
}