public HardwareUnit(HardwareNeeded hwNeeded, uint id)
 {
     this.Name    = hwNeeded.Name;
     this.Weight  = hwNeeded.Weight;
     this.Utility = hwNeeded.Utility;
     this.Id      = id;
 }
        /// <summary>
        /// I know the algorithm is not yet perfect since the transporters are not (yet) perfectly filled with low-weight but for this scenario this was by far not necessary
        /// and would only complicate the program.
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            string HwNeededPath     = Path.Combine(CurrentExeDir.FullName, "HWNeeded");
            string DriversPath      = Path.Combine(CurrentExeDir.FullName, "Drivers");
            string TransportersPath = Path.Combine(CurrentExeDir.FullName, "Transporters");

            List <Transporter>    transporters = new List <Transporter>();
            List <Driver>         drivers      = new List <Driver>();
            List <HardwareNeeded> hwNeeded     = new List <HardwareNeeded>();

            foreach (var transporterPath in Directory.GetFiles(TransportersPath))
            {
                string      transporterFileContent = File.ReadAllText(transporterPath);
                Transporter transporter            = JsonConvert.DeserializeObject <Transporter>(transporterFileContent);
                transporters.Add(transporter);
            }
            foreach (var driverPath in Directory.GetFiles(DriversPath))
            {
                string driverFileContent = File.ReadAllText(driverPath);
                Driver driver            = JsonConvert.DeserializeObject <Driver>(driverFileContent);
                drivers.Add(driver);
            }
            foreach (var hardwarePath in Directory.GetFiles(HwNeededPath))
            {
                string         hardwareFileContent = File.ReadAllText(hardwarePath);
                HardwareNeeded hardwareNeeded      = JsonConvert.DeserializeObject <HardwareNeeded>(hardwareFileContent);
                hardwareNeeded.CalculateUtilityPerKilogram();
                hwNeeded.Add(hardwareNeeded);
            }
            hwNeeded = hwNeeded.OrderByDescending(el => el.UtilityPerKilogram).ToList();
            if (transporters.Count != drivers.Count)
            {
                // if you wanted to do something in case you dont have the same amount of drivers as transporters!
            }
            int counter = 0;

            foreach (Transporter transporter in transporters)
            {
                transporter.Driver = drivers[counter];
                counter++;
            }
            foreach (Transporter transporter in transporters)
            {
                var filledWith = FillTransporter(transporter, hwNeeded);
                foreach (var hw in hwNeeded)
                {
                    var hwsAdded = filledWith.Where(el => el.Name == hw.Name);
                    hw.AmountNeeded -= (uint)hwsAdded.Count();
                    if (hw.AmountNeeded < 0)
                    {
                        throw new Exception("error in Program logic!");
                    }
                    else if (hw.AmountNeeded == 0)
                    {
                        // completely filled - nothing to do about it - could remove from list but not necessary!
                    }
                    else
                    {
                        //still hw of this kind can be needed in other location!
                    }
                }
            }
            foreach (Transporter transporter in transporters)
            {
                transporter.WriteTransporterContent();
            }
        }