Не удается динамически установить длину инициализатора массива - PullRequest
1 голос
/ 13 июня 2019

Я использую C # для подключения к FedEx API, и я немного озадачен тем, как изменить существующий код для удовлетворения моих потребностей.Включенный фрагмент является частью их стандартного кода, где они демонстрируют, как работать с 1 товаром.Однако, когда мой код запускается, у меня будет n товаров ... и я не уверен, как динамически решить эту проблему.

Например, если у меня есть 3 товара, и я вручную добавляю 3 new Commodity() выраженияэто будет работать нормально.Однако это должно быть динамически.

request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[3] { 
  new Commodity(), 
  new Commodity(), 
  new Commodity() 
};

Вот начало метода, где первая строка - это то, с чем мне нужна помощь.После этого я думаю, что все остальное в цикле, основанном на размере массива, будет хорошо.

request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[1] { 
  new Commodity() 
};

request.RequestedShipment.CustomsClearanceDetail.Commodities[0].NumberOfPieces = "1";
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Description = "Books";
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CountryOfManufacture = "US";
//
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight = new Weight();
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Value = 1.0M;
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Units = WeightUnits.LB;

Если я просто сделаю это, я получу ошибку:

request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[3] { 
  new Commodity() 
};

«Ожидается инициализатор массива длины 3»

Ответы [ 2 ]

4 голосов
/ 13 июня 2019

Во-первых, вам не нужно упоминать 1 или 3 вообще;положить [] и позволить системе вычислить необходимую вам длину:

// Commodity[3] will be created
request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[] { 
  new Commodity(), 
  new Commodity(), 
  new Commodity() 
};

или

// Commodity[1] will be created
request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[] { 
  new Commodity()
};

Если вы хотите создать массив размером n, вы можете попробовать Linq :

using System.Linq;

...

int n = 3;

request.RequestedShipment.CustomsClearanceDetail.Commodities = Enumerable
  .Range(0, n) 
  .Select(index => new Commodity())
  .ToArray();

Или даже

int n = 3;

// 3 equivalent commodities
request.RequestedShipment.CustomsClearanceDetail.Commodities = Enumerable
  .Range(0, n) 
  .Select(index => new Commodity() {
     NumberOfPieces = "1", 
     Description = "Books",
     CountryOfManufacture = "US",
     Weight = new Weight() {
       Value = 1.0M,
       Units = WeightUnits.LB
     }
   })
  .ToArray(); 
0 голосов
/ 13 июня 2019

@ Дмитрий Сэр, охватывал почти все в приведенном выше ответе ... Однако нижеследующий раздел также можно записать следующим образом:

Ваш исходный код

request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[1] { 
  new Commodity() 
};

request.RequestedShipment.CustomsClearanceDetail.Commodities[0].NumberOfPieces = "1";
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Description = "Books";
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CountryOfManufacture = "US";
//
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight = new Weight();
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Value = 1.0M;
request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Units = WeightUnits.LB;

Его можно изменить следующим образом:

Модифицированный динамический массив len и инициализированный код свойства

request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[] { 
   new Commodity {
      NumberOfPieces = "1",
      Description = "Books",
      CountryOfManufacture = "US",
      Weight = new Weight{
            Value = 1.0M,
            Units = WeightUnits.LB
      },
      // add more properties... as per requirement
   },
   // add more objects... as per requirement
};
...