2016-04-19 19 views
1

エラーメッセージに「型doubleを型int []に変換できません」と書かれています。stringint(最後は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'の3次元配列ですが意味をなさない。完全に異なる型のオブジェクトを格納する唯一の方法は、 'object'の1D配列である' object [] 'にそれらを格納することです。 –

+1

熱、価格、およびnumSoldを含むようにC#クラスを作成してください。配列を使用して(または自分の好みに応じて)リストを使ってそのクラスを反復処理することができます。オブジェクトの配列(オブジェクトが型)を持つこともできますが、クラスを非常に強くお勧めします。 –

答えて

0

あなたは、配列(またはリストまたは何でも)に異なる種類を保存したい場合、彼らは共通の基底クラスを持っていけない、あなたは箱入りのオブジェクトとして保存する必要があります。あなたがしたい場合は、

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

:あなたは

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

を行う必要があり、それらを読むために

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

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

0

一つの選択肢はobjectの配列を使用することです見ます型キャスト演算子(object)を省略することができ、コンパイラは、型キャストするはずだということ:

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

をしかし、悪い習慣することができobject[]を使用して、唯一のタイプobject[]与えられたので、あなたはそれで何の知識がないと、コンパイラが誤って入れてからあなたを停止することはありませんそれに間違ったタイプのものがあります。

:あなたが二度目のタイプを記述する必要はありませんように、あなたは、 new Tuple<string[], double[], int[]>の代わりに Tuple.Createを使用することができ、利便性のために

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

:したがって、Tupleを使用するには良い考えかもしれ

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メソッドが用意されています。可能であれば(そして極端なパフォーマンスの考慮事項がない限り)、常にリストに傾いている必要があります。

また、3つのプロパティのそれぞれを含む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

複数のタイプの配列を作成するという穴のアイデアは間違っています(ブレークデータの一貫性)。あなたが提案としてオブジェクトを使用する場合、あなたは後者を行うためにボクシング/アンボクシングの多くを持っています。温度、価格、数量&の商品リストで動作するクラスの製品を作成することをお勧めします。

関連する問題