C # как обновить список, используя данные из файла - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю над заданием, которое требует чтения ввода из двух текстовых файлов. Изменение данных первого файла на основе данных второго файла и печать результатов в третий файл.

Первый файл - это файл инвентаризации, который содержит идентификационный номер, название продукта и количество, отформатированный следующим образом:

123 | телевидение | 45
124 | компьютер | 52
125 | радио | 20

Второй файл содержит идентификационный номер и количество изменений:

123 | -8
124 | 7

В предыдущем вопросе я спросил о том, как прочитать данные первого файла в список. Я считаю, что я достиг этого в основном методе в коде ниже. Также в приведенном ниже коде у меня есть цикл, который будет читать строки из второго файла и сохранять идентификационный номер как updateID, а количество как numUpdate. Я хотел бы использовать эти значения для изменения списка Inventory, но я не уверен, как это сделать. Моей первой мыслью, когда я изучал эту проблему, был метод .IndexOf, но я не думаю, что это сработает. Каков будет процесс обновления списка Inventory данными второго файла? Конечно, я в конечном итоге захочу распечатать список обновлений в файл thrid ... но сейчас меня это не особо волнует.

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;
    }
}

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Я не буду хранить первый файл в списке, но в Dictionary<TKey, TValue>.Это позволяет искать элемент по ключу.

var Inventory = new Dictionary<int, InventoryNode>();

...

Item = new InventoryNode(ID, InvName, Number);
Inventory.Add(ID, Item);

Затем искать элемент с помощью

while ((line = f2.ReadLine()) != null)
{
    string[] currentLine2 = line.Split('|');
    int id = Convert.ToInt32(currentLine2[0]);
    numUpdate = Convert.ToInt32(currentLine2[1]);
    if (Inventory.TryGetValue(id, out var inventoryNode)) {
        inventoryNode.Quantity += numUpdate;
    }
}

Обратите внимание, что поиск в словаре намного быстрее, чем поиск в списке.Поиск по словарю имеет почти постоянное время (O(1)).Т.е. это не зависит от количества хранимых предметов.В то время как у него время доступа растет линейно с размером списка (O(n)).

Кроме того, Convert.ToInt32 создает int, в то время как Convert.ToInt16 создает short.

0 голосов
/ 16 ноября 2018

Вы идете в правильном направлении.

При анализе содержимого второго файла вы можете обновить Inventory Список следующим образом:

    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;
        }
    }

Это обновит данные вСписок Inventory, так как это справочные типы.

0 голосов
/ 16 ноября 2018

Вы можете сделать что-то вроде

Inventory.First(node => node.IDNumber == updateID).Quantity += numUpdate;

, где вы читаете свой 2-й файл

Редактировать: я написал это, предполагая, что ваш 2-й файл не содержит недопустимых идентификаторов, вам понадобитсяnullcheck

...