我是C#的新手,虽然对其他语言有一些小的经验并且碰壁了。
以下代码完全符合预期:
with open('stockcontrol.csv',newline='') as f:
for line in f:
if code in line:
data = line.split(",")
target = (data[2])
newlevel = stocklevel - quantity
updatetarget = int(target) - int(newlevel)
stocklevel = str(stocklevel)
newlevel = str(newlevel)
updatetarget = str(updatetarget)
import sys
import csv
data=[]
code = code
newval= newlevel
newtlevel = updatetarget
f=open("stockcontrol.csv")
reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget'])
for line in reader:
if line['code'] == code:
line['level']= newval
line['distancefromtarget']= newtlevel
data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget']))
f.close()
f=open("stockcontrol.csv","w")
f.write("\n".join(data))
f.close()
我完全得到了我所期望的零错误,但是以下代码让我感到难过。我希望有人可以解释我做错了什么,因为我觉得我可能缺少一些基本的东西。
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
string name = node.Attributes["name"].Value;
string ips = node.Attributes["ip"].Value;
string port = node.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
}
我只是试图并行运行循环的每次迭代。当我尝试编译时,我收到以下错误:
CS0411方法'Parallel.ForEach的类型参数 (IEnumerable,Action)'无法从使用中推断出来。 请尝试明确指定类型参数。
以下示例XML:
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
node = doc.DocumentElement.ChildNodes;
Parallel.ForEach(node,
(item) => {
string name = item.Attributes["name"].Value;
string ips = item.Attributes["ip"].Value;
string port = item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
非常感谢任何协助。
答案 0 :(得分:0)
您需要Cast
非泛型类型。完整解决方案如下。
static void Main(string[] args)
{
var xml="<root><item name='pc01' ip='192.168.0.10' port='80'><!--PC01--></item><item name='pc02' ip='192.168.0.11' port='80'><!--PC02--></item><item name='pc03' ip='192.168.0.12' port='80'><!--PC03--></item><item name='pc04' ip='192.168.0.13' port='80'><!--PC04--></item></root>";
XmlDocument doc=new XmlDocument();
// doc.Load("config.xml");
doc.LoadXml(xml);
var nodeList=doc.DocumentElement.ChildNodes;
Parallel.ForEach(nodeList.Cast<XmlNode>(),
item => {
string name=item.Attributes["name"].Value;
string ips=item.Attributes["ip"].Value;
string port=item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
Console.ReadLine();
}
答案 1 :(得分:0)
控制台中显示的项目是否不按顺序排列?
您可以安全地从多个线程调用Console.WriteLine
,但我不会指望按预期顺序实际写入控制台的项目。我希望他们通常以预期的顺序写,然后有时不会。这是多线程执行的行为。它会做你期望它做的事情,但永远不会指望它在预期的序列中发生,即使你一遍又一遍地测试它确实按照预期的顺序发生。