سؤال

لا بد لي من القيام بتمرين باستخدام المصفوفات. يجب على المستخدم إدخال 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();
}

لذا فإن سؤالي يتلخص في:

  1. كيف يمكنني السماح للمستخدم بإدخال أكثر من دفعة واحدة من المدخلات؟ على سبيل المثال ، في المرة الأولى التي يقوم فيها المستخدم بإدخال المعلومات حول العنصر (رقم المقبس والسعر والاسم) ، لكنني بحاجة إلى السماح للمستخدم بإدخال المزيد من المعلومات حول عنصر آخر؟

  2. كيف يمكنني عرض المقبس ، والسعر والاسم لكل عنصر في الصفيف بناءً على افتراض أن لدي أكثر من عنصر واحد في الصفيف؟

هل كانت مفيدة؟

المحلول

في .NET (C#) ، لا يمكن إصلاح صفيف. ليس الأمر كما لو كان في JavaScript أو PHP صفيفًا مصنوعًا للغاية ويمكن تمديده بعناصر تعسفية.

لكل تعريف ، يحتوي الصفيف الثابت الافتراضي على حجم الإصلاح ، بحيث يمكنك الرجوع إلى عنصر في الداخل باستخدام الفهرس. (( http://en.wikipedia.org/wiki/array_data_structure#array_resizing ) ولكن هناك يمكنك أن تقرأ عن الصفيف الديناميكي. في c# سيكون النظام. collections.arraylist-object. (( http://en.wikipedia.org/wiki/Dynamic_array )

لذا فإن ما تحتاجه هو إما تدفق ArrayList أو قائمة عادية أو قائمة عامة. (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 ، للحصول على صفائف أحادية البعد يمكنك استخدامها Array.Resize<T> طريقة:

int[] myArray = { 1, 2, 3 };
Array.Resize(ref myArray, 5);

رابط MSDN هو هنا.

أعتقد أنك قد تسير على خطأ ...

فكر في أن العناصر الثلاثة (رقم المخزون والسعر والاسم) هي جزء من كائن أكبر. في الوقت الحالي يمكننا فقط تسميته item. نريد تخزين عدد من itemS في قائمة أو صفيف. فكر في استخدام نهج موجه نحو كائن مثل هذا:

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 {رقم الأسهم ، السعر ، اسم العنصر} ، ثم يجب عليك إدخال البيانات في قائمة. أخيرًا ، يمكنك التحويل إلى StockInfo [] باستخدام طريقة toarray في القائمة.

هل تستطيع استعمال ArrayList في حين أن؟ سوف تغيير حجمها حسب الحاجة.

لقد واجهت نفس المشكلة ولكن لم أتمكن من تغيير النوع واضطررت إلى التمسك بالمصفوفة لأنني كنت أقدم فئة API الموجودة. فيما يلي طريقة قالب بسيطة تمتد صفيفًا موجودًا:

    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 ، فيمكنك استخدام طريقة التمديد المفيدة 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top