PDA

View Full Version : مبتدی: استفاده از آرایه یا لیست؟



ntayeban
شنبه 11 شهریور 1402, 10:39 صبح
سلام

دوستان من میخوام یه برنامه بنویسم که
1-نام و نام خانوادگی و شناسه دانشجو رو بگیره و ثبت کنه و شناسه باید منحصر به فرد باشه
2- درس رو ثبت کنه که اونم آی دی و اسمش هست

سوالم اینکه :
برای ثبت دانشجو بهتره از لیست استفاده کنم یا آرایه ؟ هر کدوم یه مزایایی دارن
و دوم اینکه برای ثبت درس می خوام از دیکشنری استفاده کنم / اکیه ؟


پیشاپیش ممنون از راهنماییتون

SajjadKhati
شنبه 11 شهریور 1402, 12:09 عصر
سلام

آرایه ، یک مجموعه با مقدار ثابت هست . اگر نیاز به افزایش اندازه ی آرایه را داشته باشید ، باید آرایه ی جدیدی درست کنید و همه ی آیتم هاش را درون آرایه ی جدید بفرستید .

-----------------------

List ، یک مجموعه ی پویا هست . اما عملکرد واقعی اش ، همون شبیه آرایه هست . به این معنا که وقتی شما یک شی از List میسازید ، یک آرایه ای با اندازه ای که شما ظرفیت (capacity) اش را مشخص میکنید ، میسازه (capacity بصورت پیش فرض ، مقدار 0 داره) .

هر وقت هم تعداد آیتم های آرایه ، به مقدار capacity در List برسه ، List ، بصورت اتوماتیک یک آرایه ی جدیدی با capacity و اندازه ی آرایه ی 2 برابر بیشتر از آرایه ی قبلیِ List میسازه و همه ی آیتم های آرایه ی قبلی را توی آرایه ی جدید میریزه .

اما چون کار کردن با List ها ، خیلی راحت تر هست (از انجام اتوماتیک تغییر آرایه که توضیح داده شد ، تا توابعی برای جستجو و خیلی موارد دیگه) ، استفاده از List ها بجای آرایه ها ، خیلی رایج تر از استفاده از آرایه ها هست .

--------------------

جستجوی آرایه را که خودتون انجام میدید . معمولا در بدترین حالت ، همه ی آیتم هاش را جستجو میکنید تا مقدار مورد نظر را پیدا کنید (یعنی بدترین مرتبه ی زمانی جستجو اش ، O(n) هست . یعنی اگر 10 تا آیتم داشته باشید ، در بدترین حالت و در زمانی که آرایه تون مرتب نشده باشه ، باید 10 بار در آرایه ، جستجو انجام بدید) .

List هم اگر مرتب نباشه (یا از نوع SortedList نباشه) هم در بدترین حالت ، مثل آرایه ها هستند (یعنی بدترین مرتبه ی زمانی جستجو اش ، O(n) هست) .


اما Dictionary ، بخاطر استفاده از الگوریتم hash ، اغلب ، میزان جستجو اش ، فقط با یکبار جستجو هست . یعنی شما اگر 1 میلیون آیتم هم در Dictionary داشته باشید ، وقتی کلیدی را میخواهید جستجو کنید ، فقط یکبار جستجو میشه (مرتبه ی زمانی O(1) داره) .
یعنی جستجو در Dictionary ، معمولا خیلی خیلی سریعتر از List و آرایه هست .

هر چی تعداد آیتم ها بیشتر باشه ، این سریع بودنِ جستجو در Dictionary ، خیلی خیلی خودش را بیشتر نشون میده (فرضا تعداد آیتم های چندین هزار یا چند میلیون) .

mazoolagh
شنبه 11 شهریور 1402, 14:33 عصر
آرایه ، یک مجموعه با مقدار ثابت هست . اگر نیاز به افزایش اندازه ی آرایه را داشته باشید ، باید آرایه ی جدیدی درست کنید و همه ی آیتم هاش را درون آرایه ی جدید بفرستید .


این عبارت درست نیست!
اندازه آرایه بصورت دینامیکی و با حفظ مقادیر اصلی قابل تغییر هست.

DIM a() AS INTEGER = {0 , 1 , 2 , 3}
REDIM PRESERVE a(5)
a(4)= 5
a(5)= 6


int[] a = new[] {0 , 1 , 2 , 3};
array.resize(ref a , 6);
a[4]= 4;
a[5]= 5;

SajjadKhati
شنبه 11 شهریور 1402, 15:08 عصر
این عبارت درست نیست!
اندازه آرایه بصورت دینامیکی و با حفظ مقادیر اصلی قابل تغییر هست.

DIM a() AS INTEGER = {0 , 1 , 2 , 3}
REDIM PRESERVE a(5)
a(4)= 5
a(5)= 6


int[] a = new[] {0 , 1 , 2 , 3};
array.resize(ref a , 6);
a[4]= 4;
a[5]= 5;

سلام

خوب رفتار متد Array.Resize چطوره؟
این ، متد Array.Resize هست :

array.cs (microsoft.com) (https://referencesource.microsoft.com/#mscorlib/system/array.cs,71074deaf111c4e3)



public static void Resize<T>(ref T[] array, int newSize) {
if (newSize < 0)
throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
Contract.Ensures(Contract.ValueAtReturn(out array) != null);
Contract.Ensures(Contract.ValueAtReturn(out array).Length == newSize);
Contract.EndContractBlock();

T[] larray = array;
if (larray == null) {
array = new T[newSize];
return;
}

if (larray.Length != newSize) {
T[] newArray = new T[newSize];
Array.Copy(larray, 0, newArray, 0, larray.Length > newSize? newSize : larray.Length);
array = newArray;
}
}




پارامتر array را توی آرایه ی larray میریزه .
یک آرایه ی جدید بنام newArray اما با اندازه ی پارامتر newSize میگیره .
آرایه ی larray (که همان پارامتر array هست) را توی آرایه ی newArray میریزه (توسط متد Array.Copy) .
نهایتا آرایه ی newArray را که آرایه ای جدید بود را به عنوان مقدار ، در پارامتر array میریزه .

ROSTAM2
شنبه 11 شهریور 1402, 20:13 عصر
با سلام
بنظر من از Dictionary استفاده کنی بهتره چون کلید شناسایی و وجود آی.دی براحتی قابل استعلامه و برای Value هم یک کلاس ایجاد بشه که همه فیلد های مورد نیاز رو داشته باشه اینجوری سریعتر و بهتر به نتیجه می رسی تا آرایه چون آرایه ها ی دقت خاصی هم توی مقداردهی و هم فراخوانی مقادیر می خواد و هم برای کلید کردن آی.دی دشوار هستند.

mazoolagh
یک شنبه 12 شهریور 1402, 16:31 عصر
سلام
خوب رفتار متد Array.Resize چطوره؟
این ، متد Array.Resize هست :


سلام و روز خوش
از دید کلی همین که یک متد یا تابع یا ویژگی یا دیتاتایپ و ... مستقیم توسط کامپایلر پشتیبانی میشه کافی هست و این که چه سازوکار درونی داره در نگاه اول مهم نیست.
اینجا هم همین که array.size و redim preserve هست و داکیومنت هم شده دیگه نمیتونیم حکم بدیم که آرایه اندازه اش ثابت هست.
چیزی که نظر من بود همین هست که این حکم دادن نادرسته.

ولی:
میتونیم از دید پرفورمنس بگیم اگه اندازه مجموعه دیتا قرار هست متغیر باشه (بخصوص در حلقه های بزرگ) بهتره از آرایه استفاده نکنیم
یا
آرایه برای دیتا با اندازه ثابت مناسبه.

به هر حال حتی کامپایلر سی استاندارد هم چند مرحله ای نوشته میشه، یعنی اول فقط یک بخش خیلی محدود اولیه از زبان رو پشتیبانی میکنه،
بعد با اون کامپایلر اولیه بخشهای جدیدتر اضافه میشه و در هر مرحله هم کامپایلر جلو میره تا نهایی بشه.

mazoolagh
یک شنبه 12 شهریور 1402, 16:34 عصر
سوالم اینکه :
برای ثبت دانشجو بهتره از لیست استفاده کنم یا آرایه ؟ هر کدوم یه مزایایی دارن
و دوم اینکه برای ثبت درس می خوام از دیکشنری استفاده کنم / اکیه ؟

دیتاتیبل رو هم درنظر بگیرین - در نهایت شما باید بتونین از دیتابیس بخونین و درش بنویسین.

SajjadKhati
یک شنبه 12 شهریور 1402, 23:20 عصر
سلام و روز خوش
از دید کلی همین که یک متد یا تابع یا ویژگی یا دیتاتایپ و ... مستقیم توسط کامپایلر پشتیبانی میشه کافی هست و این که چه سازوکار درونی داره در نگاه اول مهم نیست.
اینجا هم همین که array.size و redim preserve هست و داکیومنت هم شده دیگه نمیتونیم حکم بدیم که آرایه اندازه اش ثابت هست.
چیزی که نظر من بود همین هست که این حکم دادن نادرسته.

ولی:
میتونیم از دید پرفورمنس بگیم اگه اندازه مجموعه دیتا قرار هست متغیر باشه (بخصوص در حلقه های بزرگ) بهتره از آرایه استفاده نکنیم
یا
آرایه برای دیتا با اندازه ثابت مناسبه.

به هر حال حتی کامپایلر سی استاندارد هم چند مرحله ای نوشته میشه، یعنی اول فقط یک بخش خیلی محدود اولیه از زبان رو پشتیبانی میکنه،
بعد با اون کامپایلر اولیه بخشهای جدیدتر اضافه میشه و در هر مرحله هم کامپایلر جلو میره تا نهایی بشه.

سلامی مجدد
وقت به خیر .

حکم ندادم :

C#‎‎‎ - Arrays (tutorialspoint.com) (https://www.tutorialspoint.com/csharp/csharp_arrays.htm)



An array stores a fixed-size sequential collection of elements of the same type.

mazoolagh
سه شنبه 14 شهریور 1402, 11:37 صبح
An array stores a fixed-size sequential collection of elements of the same type.
خیرالکلام ما قلّ و دلّ