Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C如何使用文件中的数据更新列表_C#_Arrays_List_File Io - Fatal编程技术网

C# C如何使用文件中的数据更新列表

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

我正在做一项作业,需要从两个文本文件中读取输入。基于第二个文件的数据修改第一个文件的数据,并将结果打印到第三个文件

第一个文件是包含ID号、产品名称和数量的库存文件,格式如下:

    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的定义。是否有方法修复此问题?