質問
配列を使用して演習を行う必要があります。ユーザーは3つの入力(毎回、アイテムに関する情報)を入力する必要があり、入力は配列に挿入されます。次に、配列を表示する必要があります。
ただし、配列内の情報を変更せずに配列の長さを増やすのは困難です。ユーザーが別の入力セットを入力できるようにするにはどうすればよいですか?これは私がこれまでに持っているものです:
public string stockNum;
public string itemName;
public string price;
string[] items = new string[3];
public string [] addItem(string[] items)
{
System.Console.WriteLine("Please Sir Enter the stock number");
stockNum = Console.ReadLine();
items.SetValue(stockNum, 0);
System.Console.WriteLine("Please Sir Enter the price");
price = Console.ReadLine();
items.SetValue(price, 1);
System.Console.WriteLine("Please Sir Enter the item name");
itemName = Console.ReadLine();
items.SetValue(itemName, 2);
Array.Sort(items);
return items;
}
public void ShowItem()
{
addItem(items);
Console.WriteLine("The stock Number is " + items[0]);
Console.WriteLine("The Item name is " + items[2]);
Console.WriteLine("The price " + items[1]);
}
static void Main(string[] args)
{
DepartmentStore depart = new DepartmentStore();
string[] ar = new string[3];
// depart.addItem(ar);
depart.ShowItem();
}
だから私の質問は次のように要約されます:
-
ユーザーが複数の入力バッチを入力できるようにするにはどうすればよいですか? たとえば、ユーザーが初めてアイテムに関する情報(ソケット番号、価格、名前)を入力しますが、ユーザーが別のアイテムに関する詳細情報を入力できるようにする必要がありますか?
-
配列内に複数のアイテムがあるという仮定に基づいて、配列内の各アイテムのソケット番号、価格、および名前を表示するにはどうすればよいですか?
解決
.NET(C#)では、配列のサイズは変更できません。 JavaScriptやPHPのように配列が非常に柔軟になり、任意の要素で拡張できるようになりました。
定義ごとにデフォルトの静的配列には固定サイズがあるため、インデックスを使用して内部の要素を参照できます。 ( http://en.wikipedia.org/wiki/Array_data_structure#Array_resizing ) ただし、動的配列について読むことができます。 C#では、System.Collections.ArrayList-Objectになります。 ( http://en.wikipedia.org/wiki/Dynamic_array )
したがって、必要なのはArrayList-Definitionまたは通常のリストまたは汎用リストのいずれかです。 (System.Collections.Generic.List)
string[] items = new string[3] { "input1", "input2", "input3" };
string[] moreItems = new string[10] { "input4", "input5" };
// array to list
List<string> itemsList = items.ToList<string>();
itemsList.Add("newItem");
// or merge an other array to the list
itemsList.AddRange(moreItems);
// list to array
string[] newArray = itemsList.ToArray();
他のヒント
.NET Framework 3.5以降、1次元配列の場合はArray.Resize<T>
メソッドを使用できます:
int[] myArray = { 1, 2, 3 };
Array.Resize(ref myArray, 5);
MSDNリンクはこちらです。
問題について間違っている可能性があると思います...
3つのアイテム(在庫番号、価格、名前)は、より大きなオブジェクトの一部であると考えてください。今のところ、item
と呼ぶことができます。多数の<=>をリストまたは配列に保存します。このようなオブジェクト指向アプローチの使用を検討してください。
class Widget
{
public int StockNum;
public int Price;
public string Name;
Widget(stockNum, price, name)
{
this.StockNum= stockNum;
this.Price = price;
this.Name = name;
}
}
今、これらのオブジェクトのリストをインスタンス化できます:
List<Widget> items = new List<Widget>();
そしてそれらにアイテムを追加します:
for (int i = 0; i < 5; i++)
{
//Get input from user
System.Console.WriteLine("Please Sir Enter the stock number");
stockNum= Convert.ToInt32(Console.ReadLine()); //This isn't very safe...
System.Console.WriteLine("Please Sir Enter the price");
price = Convert.ToInt32(Console.ReadLine()); //This isn't very safe...
System.Console.WriteLine("Please Sir Enter the item name");
name = Console.ReadLine();
//Then add it to a new object
Widget item = new Widget(stockNum, price, name);
//And add this item to a list
items.Add(item);
}
割り当てに他のコレクションクラスではなく配列を使用する必要があると仮定すると、難しいことをする必要があります。
配列は不変です。つまり、作成後に変更することはできません。内容を変更できますが、配列のサイズは変更できません。配列を拡大または縮小する必要がある場合は、新しいアイテム数で新しい配列を作成し、必要なアイテムを古い配列から新しい配列にコピーする必要があります。
たとえば、配列を取得して偶数要素のみをコピーするとします。
int[] a = new int[] {0,1,2,3,4,5,6,7,8,9};
int[] a2 = new int[a.Length / 2];
int counter = 0;
for (int i = 0; i < a.Length; i = i + 2)
{
a2[counter++] = a[i];
}
その後、常にa2を割り当てて戻すことができます
a = a2;
System.Collections.Generic.List<T>
を使用すると、サイズ変更可能なコレクションが提供されます。このコレクションには、必要に応じて通常の配列を返す.ToArray()
メソッドもあります。
リストを使用してから、配列に変換します。
実際、この例では、StockInfo {stock number、price、item name}のクラスまたは構造体が必要です。その後、リストにデータを入力する必要があります。最後に、リストのToArrayメソッドを使用してStockInfo []に変換できます。
代わりに ArrayList を使用できますか?必要に応じてサイズが変更されます。
同じ問題が発生しましたが、既存のAPIクラスを拡張していたため、型を変更できず、Arrayを使用する必要がありました。以下は、既存の配列を拡張する単純なテンプレートメソッドです。
public static T[] ExtendArray<T> ( T[] array , uint index) where T:new()
{
List<T> list = new List<T>();
list.AddRange(array);
while (list.Count < index) {
list.Add(new T());
}
return list.ToArray();
}
上記はデフォルトのコンストラクタで要素を初期化することにも注意してください。
予想される最大の配列と同じ大きさの配列を使用して、配列のサイズを変更できないという「問題」を回避できます。これは、構造化プログラミングではなく、ハッキングと見なされることに注意してください!
System.Linqにアクセスできる場合、配列などのIEnumerableオブジェクトに便利な拡張メソッド Concat を使用できます。これにより、配列を拡張できます:
int[] result = new int[] { 1, 2 };
int[] extend = new int[] { 3, 4 };
result = result.Concat(extend).ToArray();
foreach (int i in result)
{
Console.WriteLine(i.ToString());
}
結果:
1
2
3
4