c#动态修改列表
正确!谢谢! 但我不明白如何使用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();
}
}
感谢
如果要修改现有的名单,你必须使用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();
谢谢M.Bychenko!我有我的答案。 – Jablonovo
这是因为
String.Format(item, i_StationNum, 200)
不更改列表中的字符串。
您必须将String.Format
结果指定给您的项目。
无需重复foreach(第一个,对您的项目没有任何作用)。试试这个:
foreach (var item in genlnkPLC)
Console.WriteLine("with List: result= "+ String.Format(item, i_StationNum, 200));
你猜?我们不想在这里猜测。我们需要推理的答案。 –
我删除了@ThomasWeller。问候 – RizkiDPrast
String.Format()
返回一个字符串,它不会改变你正在格式化的任何东西。因此,您的第一个foreach (var item in genlnkPLC)
会创建立即销毁的临时字符串。
foreach (var item in genlnkPLC)
{
Console.WriteLine("with List = " + String.Format(item, i_StationNum, 200));
}
在您不使用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));
代替。
问题是,您无法更改在foreach
循环中枚举的元素的引用。 string
是一个不可变对象,所以更改它会替换旧的引用。如果你想改变在列表中的元素,你需要做一个for
循环,就像这样:
for (int item = 0; item < genlnkPLC.Count; item++)
genlnkPLC[item]= String.Format(genlnkPLC[item], i_StationNum, 200);
感谢您的回答。我想画布列表和工作列表是好的...我没有看到其他方式改变列表清除擦除{0},所以它会工作一次,然后它会bugg。所以我想到了第二个列表改为与它一起工作,第一个列表改变并保持{0}。 – Jablonovo
由于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();
}
}
同样的String.Format不打印,所以你必须做'Console.WriteLine(的String.Format(项目,i_StationNum,200); )' – Sid
哇,4个答案后,仍然没有答案告诉OP如何更改列表中的字符串。他们都只是告诉如何打印到控制台。 –