2016-04-19 3 views
1

Мои сообщения об ошибках говорят: «Невозможно преобразовать тип double в тип int []», а также с string и int (в конце, arraySalsa) Я понимаю, почему, но я не уверен, как исправить так, что массив до сих пор принимает их всех. Можете ли вы помочь?Вывод массива с несколькими типами возврата C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] heat = new string[] { "Mild", "Medium", "Hot", "Super Hot", "Scorching" }; 
     double[] price = new double[4]; 
     int[] numSold = new int[4]; 

     int counter; 
     { 
      for (counter = 0; counter != heat.Length; counter++) 
      { 
       Console.WriteLine("What do you wish to charge for " + heat[counter] + " ?"); 
       price[counter] = Convert.ToDouble(Console.ReadLine()); 
       Console.WriteLine("How many jars of " + heat[counter] + " did you sell last year?"); 
       numSold[counter] = Convert.ToInt32(Console.ReadLine()); 
      }//end forloop 

     } 

     for (int count = 0; count < heat.Length; count++) 
     { 
      Console.WriteLine("You sold " + numSold[count] + " of " + heat[count] + " at $" + price[count] + " each."); 
     }//end forloop 

     Array[,,] arraySalsa; 
     arraySalsa = new Array[heat, price, numSold]; 
    } 
} 
+5

Не делайте этого ... просто не делайте этого. Вы должны использовать классы с коллекциями 'List ', а не массивы, сращенные в многомерные массивы. Доступны мощные управляемые коллекции для вас и объекты первого класса в виде классов. Научитесь любить их :). –

+0

'Array [,,]' представляет собой трехмерный массив 'Array', это не имеет никакого смысла. Единственный способ хранить объекты совершенно разных типов - хранить их в 'object []', который является 1D массивом 'object'. –

+1

Вам следует попробовать создать класс C#, чтобы сдержать ваше тепло, цену и numSold. Вы можете использовать массив (или, по моим предпочтениям) List для повторения этого класса. Вы также можете иметь массив объектов (объект, являющийся типом), но я рекомендую класс очень сильно. –

ответ

0

если вы хотите хранить различные типы в массив (или список или любой другой), и они не имеют общий базовый класс, то вам необходимо хранить их в штучной упаковке объектов.

var salsa = new object[20]; 
salsa[0] = 1; 
salsa[1] = 42.42; 
salsa[3] = "hot"; 

читать их вам нужно сделать

var s1 = salsa[1]; 
if (s1 is int) 
    Console.WriteLine((int)s1); 
if(s1 is double) 
    COnsole.WriteLine((double)s1); 
etc... 

см How to unbox from object to type it contains, not knowing that type at compile time?

0

Одним из вариантов является использование массива object с:

object[] arraySalsa; 
arraySalsa = new object[] {(object)heat, (object)price, (object)numSold}; 

Если вы хотите, вы может отказаться от оператора моделирования, (object), а компилятор выведет что он должен типаж:

object[] arraySalsa; 
arraySalsa = new object[] {heat, price, numSold}; 

Однако использование object[] может быть плохой практикой, потому что дается только тип object[], у вас нет знаний о том, что в нем, и компилятор не остановит вас от случайного ввода неправильный тип вещи в нем. Поэтому, может быть, лучше использовать Tuple:

Tuple<string[], double[], int[]> tupleSalsa; 
tupleSalsa = new Tuple<string[], double[], int[]>(heat, price, numSold); 

Для удобства, вы можете использовать Tuple.Create вместо new Tuple<string[], double[], int[]>, так что вам не придется писать тип из второй раз:

Tuple<string[], double[], int[]> tupleSalsa; 
tupleSalsa = Tuple.Create(heat, price, numSold); 
1

Как уже упоминалось в моем комментарии, вы должны использовать класс, а не многомерный массив.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var measurements = new Measurements(); 
     measurements.Heat = new string[] 
      { "Mild", "Medium", "Hot", "Super Hot", "Scorching" }.ToList(); 
     measurements.Price = new List<double>(4); 
     measurements.NumSold = new List<int>(4); 

     int counter; 
     { 
      for (counter = 0; counter != measurements.Heat.Count; counter++) 
      { 
       Console.WriteLine("What do you wish to charge for " + 
        measurements.Heat[counter] + " ?"); 
       measurements.Price[counter] = Convert.ToDouble(Console.ReadLine()); 
       Console.WriteLine("How many jars of " + measurements.Heat[counter] + 
        " did you sell last year?"); 
       measurements.NumSold[counter] = Convert.ToInt32(Console.ReadLine()); 
      } 
     } 

     for (int count = 0; count < measurements.Heat.Count; count++) 
     { 
      Console.WriteLine("You sold " + measurements.NumSold[count] + " of " + 
       measurements.Heat[count] + " at $" + measurements.Price[count] 
       + " each."); 
     } 

     // your arraySalsa is now just your measurements instance 
    } 
} 

public class Measurements 
{ 
    public List<string> Heat { get; set; } 
    public List<double> Price { get; set; } 
    public List<int> NumSold { get; set; } 
} 

Существует множество преимуществ использования списков по массивам на C#, даже при простой индексации. Поскольку они динамически изменяются для вас, вам не нужно беспокоиться о повышении ваших верхних границ. Кроме того, в вашем распоряжении мощные методы LINQ, которые помогут вам легче управлять своими коллекциями. Когда это возможно (и если у вас нет экстремальных соображений производительности), вы всегда должны ориентироваться на списки.

В качестве альтернативы вы можете создать класс Measurement, который содержит каждое из трех свойств и создать коллекцию этого класса, которая очистит все операции индексирования.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var measurements = new List<Measurement>(); 
     var heat = new string[] 
      { "Mild", "Medium", "Hot", "Super Hot", "Scorching" }.ToList(); 

     int counter; 
     { 
      for (counter = 0; counter != heat.Count; counter++) 
      { 
       var measurement = new Measurement() { Heat = heat[counter]}; 
       Console.WriteLine("What do you wish to charge for " + 
        measurement.Heat + " ?"); 
       measurement.Price = Convert.ToDouble(Console.ReadLine()); 
       Console.WriteLine("How many jars of " + measurement.Heat + 
        " did you sell last year?"); 
       measurement.NumSold = Convert.ToInt32(Console.ReadLine()); 
       measurements.Add(measurement); 
      } 
     } 

     measurements.ForEach(x => 
     { 
      Console.WriteLine("You sold " + x.NumSold + " of " 
       + x.Heat + " at $" + x.Price + " each."); 
     }); 
    } 
} 

public class Measurement 
{ 
    public string Heat { get; set; } 
    public double Price { get; set; } 
    public int NumSold { get; set; } 
} 
0

ошибка идеи создания массива нескольких типов неверна (ломается согласованность данных). Если вы используете объект, как было предложено, у вас будет много бокса/unboxing для последнего. Я бы предложил создать классный продукт с 3 атрибутами: температура, цена, количество & работа со списком продуктов ...

Смежные вопросы