C# C如何使用文件中的数据更新列表
我正在做一项作业,需要从两个文本文件中读取输入。基于第二个文件的数据修改第一个文件的数据,并将结果打印到第三个文件 第一个文件是包含ID号、产品名称和数量的库存文件,格式如下:C# C如何使用文件中的数据更新列表,c#,arrays,list,file-io,C#,Arrays,List,File Io,我正在做一项作业,需要从两个文本文件中读取输入。基于第二个文件的数据修改第一个文件的数据,并将结果打印到第三个文件 第一个文件是包含ID号、产品名称和数量的库存文件,格式如下: while ((line = f2.ReadLine()) != null) { string[] currentLine2 = line.Split('|'); updateID = currentLine2[0]; numUpdate = Convert
while ((line = f2.ReadLine()) != null)
{
string[] currentLine2 = line.Split('|');
updateID = currentLine2[0];
numUpdate = Convert.ToInt32(currentLine2[1]);
var inventoryNode = Inventory.Where(i=>i.ID == updateID).FirstOrDefault();
if(inventoryNode != null)
{
inventoryNode.Number += numUpdate;
}
}
123 |电视| 45
124 |计算机| 52
125 |无线电| 20
第二个文件包含ID号和数量变化:
123 |-8
124 | 7
在前面的问题中,我询问了如何将第一个文件的数据读入列表。我相信我已经在下面代码中的主要方法中实现了这一点。同样在下面的代码中,我有一个循环,它将读取第二个文件中的行,并将ID号存储为updateID,将数量存储为numUpdate。我想使用这些值来修改列表清单,但我不确定如何做到这一点。当我研究这个问题时,我的第一个想法是.IndexOf方法,但我认为这不起作用。使用第二个文件的数据更新库存清单的过程是什么?当然,我最终会希望将更新列表打印到第三个文件中……但我现在并不真正关心
class Program
{
public class InventoryNode
{
public int IDNumber;
public string Name;
public int Quantity;
public InventoryNode()
{
IDNumber = 0;
Name = " ";
Quantity = 0;
}
public InventoryNode(int ID, string InvName, int Number)
{
IDNumber = ID;
Name = InvName;
Quantity = Number;
}
public override string ToString() // This one is a freebie
{
return IDNumber + " | " + Name + " | " + Quantity;
}
}
static void Main(String[] args)
{
int ID;
string InvName;
int Number;
string updateID;
int numUpdate;
string line;
List<InventoryNode> Inventory = new List<InventoryNode>();
InventoryNode Item = null;
StreamReader f1 = new StreamReader(args[0]);
StreamReader f2 = new StreamReader(args[1]);
StreamWriter p = new StreamWriter(args[2]);
while ((line = f1.ReadLine()) != null)
{
string[] currentLine = line.Split('|');
{
ID = Convert.ToInt16(currentLine[0]);
InvName = currentLine[1];
Number = Convert.ToInt16(currentLine[2]);
}
Item = new InventoryNode(ID, InvName, Number);
Inventory.Add(Item);
}
while ((line = f2.ReadLine()) != null)
{
string[] currentLine2 = line.Split('|');
updateID = currentLine2[0];
numUpdate = Convert.ToInt16(currentLine2[1]);
}
return;
}
}
你可以这样做 Inventory.Firstnode=>node.IDNumber==updateID.Quantity+=numUpdate; 你在哪里读你的第二份文件
编辑:我写了这篇文章,假设你的第二个文件不包含无效的id,你需要一个空检查。我不会将第一个文件存储在列表中,而是存储在一个文件中。这允许您按键查找项目
var Inventory = new Dictionary<int, InventoryNode>();
...
Item = new InventoryNode(ID, InvName, Number);
Inventory.Add(ID, Item);
请注意,在字典中查找要比在列表中搜索快得多。字典查找的时间几乎为常数O1。也就是说,它不取决于存储的项目数量。而访问时间随着列表大小的增加而线性增长
此外,Convert.ToInt32创建一个int,而Convert.ToInt16创建一个short。您走的方向是正确的 在分析第二个文件的内容时,您可以按如下方式更新库存列表:
while ((line = f2.ReadLine()) != null)
{
string[] currentLine2 = line.Split('|');
updateID = currentLine2[0];
numUpdate = Convert.ToInt32(currentLine2[1]);
var inventoryNode = Inventory.Where(i=>i.ID == updateID).FirstOrDefault();
if(inventoryNode != null)
{
inventoryNode.Number += numUpdate;
}
}
这将更新列表清单中的数据,因为这些是引用类型。int是Int32,而不是Int16。我添加此项是为了了解其工作原理,并在第7行的I.ID下收到一条错误消息。关于Program.InventoryNode的某些内容没有ID的定义。是否有方法修复此问题?