PDA

View Full Version : سوال: تغیر بعد آرایه بعد از تعریف



nahid1388
شنبه 11 مهر 1388, 17:06 عصر
سلام دوستان
من تازگیا C#‎ کار می کنم میخواستم ببینم وقتی یک آرایه تعریف کردیم و سایزش رو هم تعیین کردیم چطوری میشه بدون از دست رفتن داده های توی آرایه مجددا سایزش رو افزایش داد
معادلش توی Vb.net اینجوری میشه:


Dim buffer(524285) AsByte
ReDim Preserve buffer(i - 1)

nahid1388
شنبه 11 مهر 1388, 19:14 عصر
یعنی واقعا کسی نیست جواب منو بده؟؟؟:گریه::گریه::گریه:

alireza_tavakol
شنبه 11 مهر 1388, 20:26 عصر
اگه جستجو میکردید زود تر به نتیجه میرسیدید:چشمک:
http://barnamenevis.org/forum/showthread.php?t=176716&highlight=%D8%A2%D8%B1%D8%A7%DB%8C%D9%87+%D9%BE%D9 %88%DB%8C%D8%A7

nahid1388
شنبه 11 مهر 1388, 22:56 عصر
اگه جستجو میکردید زود تر به نتیجه میرسیدید:چشمک:
http://barnamenevis.org/forum/showthread.php?t=176716&highlight=%D8%A2%D8%B1%D8%A7%DB%8C%D9%87+%D9%BE%D9 %88%DB%8C%D8%A7

ولی این جواب من نیست
شما اگه توجه کرده باشید توی اون مثال محتویات آرایه پاک میشه اما توی این مثالی که من زدم تنها سایز آرایه رو افزایش میدیم(به کمک کلمه کلیدی ReDim)
و محتویات قبلی آرایه سرجاش میمونه(به کمک کلمه کلیدی PreServe)
اصلا همچین امکانی در C#‎ وجود داره ؟؟؟

اَرژنگ
شنبه 11 مهر 1388, 23:30 عصر
ولی این جواب من نیست
شما اگه توجه کرده باشید توی اون مثال محتویات آرایه پاک میشه اما توی این مثالی که من زدم تنها سایز آرایه رو افزایش میدیم(به کمک کلمه کلیدی ReDim)
و محتویات قبلی آرایه سرجاش میمونه(به کمک کلمه کلیدی PreServe)
اصلا همچین امکانی در C#‎‎‎ وجود داره ؟؟؟
چرا از
List<byte> استفاده نمیکنید؟

alireza_tavakol
یک شنبه 12 مهر 1388, 00:48 صبح
ولی این جواب من نیست
شما اگه توجه کرده باشید توی اون مثال محتویات آرایه پاک میشه اما توی این مثالی که من زدم تنها سایز آرایه رو افزایش میدیم(به کمک کلمه کلیدی ReDim)
و محتویات قبلی آرایه سرجاش میمونه(به کمک کلمه کلیدی PreServe)
اصلا همچین امکانی در C#‎‎‎ وجود داره ؟؟؟
دقیقا مثل VB آرایه پویا نداریم باید با یک آرایه کمکی فرآیند ReDim رو شبیه سازی کنی تا اطلاعات قبلی از بین نره
اینم هم یک مثال عملی


// Create an integer array with three elements
int [] fib = new int[3];
fib[0] = 1;
fib[1] = 1;
fib[2] = 2;
// Redimension message to a 10 element array
int [] temp = new int[10];
// Copy the fib array to temp
fib.CopyTo(temp, 0);
// Assign temp to fib
fib = temp;
در ضمن توی اون تاپیکی که لینکش رو داده بودم دقیقا" ذکر شده بود

alireza_tavakol
یک شنبه 12 مهر 1388, 00:52 صبح
چرا از
List<byte> استفاده نمیکنید؟

با تشکر از پاسخ حضرت عالی

چرا وقتی کسی نیاز به آرایه پویا داره همه بهش لیست جنریک رو پیشنهاد میدن:متفکر: همان طوری که شما استحضار دارین تفاوت لیست تا آرایه مثل تفاوت زمین تا آسمان است:متعجب: به نظر من اگه کسی ساختمان داده مناسب رو انتخاب نکنه کاری بر خلاف اصول حرفه ای انجام داده

اَرژنگ
یک شنبه 12 مهر 1388, 14:57 عصر
با تشکر از پاسخ حضرت عالی

چرا وقتی کسی نیاز به آرایه پویا داره همه بهش لیست جنریک رو پیشنهاد میدن:متفکر: همان طوری که شما استحضار دارین تفاوت لیست تا آرایه مثل تفاوت زمین تا آسمان است:متعجب: به نظر من اگه کسی ساختمان داده مناسب رو انتخاب نکنه کاری بر خلاف اصول حرفه ای انجام داده

۱.از کجا میدونیم که ساختمان داده مناسب رو انتخاب کردند؟ (اگر لزومی به انتخواب آرایه دارند را میتوانند در جواب پست من بفرستند)
۲.چیزی که لازم دارند قابلیت عوض کردن سایز آرایه است، و همانطوری که شما استحضار دارید، آرایه‌ها برایه عوض شدن سایز شناخته نیستند، استفاده از لیست جنریک ۲ تا فایده دارد:
۱.با قوی نوع کار کردن (strong typing)، میشه کار کرد.
۲.قابلیت اضافه کردن و کم کردن را دارد.

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

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

ولی اگر دلیلی برایه استفاده از آرایه داشته باشند که ساختمان داده مناسب باشد، اونوقت حرف شما کاملا در این موضوع صادق است.

http://stackoverflow.com/questions/327916/redim-preserve-in-c

corona
یک شنبه 12 مهر 1388, 16:17 عصر
سلام دوستان
من تازگیا C#‎‎ کار می کنم میخواستم ببینم وقتی یک آرایه تعریف کردیم و سایزش رو هم تعیین کردیم چطوری میشه بدون از دست رفتن داده های توی آرایه مجددا سایزش رو افزایش داد
معادلش توی Vb.net اینجوری میشه:


Dim buffer(524285) AsByte
ReDim Preserve buffer(i - 1)


دوست من با تابع Resize کلاس Array میتونی اندازه آرایه رو به سایز مورد نظرت تغییر بدی و محتویات قبلی آرایه بدون تغییر باقی می مونن . مثل کد زیر


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


کد بالا اول یک آرایه به طول 3 تعریف میشه و تو خط بعد طولش میشه 5 و اون دو خانه ای هم که اضافه میشن مقدار 0 توشون قرار میگیره .

alireza_s_84
یک شنبه 12 مهر 1388, 16:46 عصر
سلام خدمت دوستان عزیز:
دوستان ابتدای امر بنده جواب ایشون رو دادم در همینجا(اما بعد فکری به ذهنم رسید تا پاسخ دهندگان به این سوال رو محکی زده باشم) به همین خاطر پاسخم رو حذف کردم (به تاپیک بین 3 و 4توجه کنید)
جناب آقای توکل با احترام جواب پیشنهادی شما لقمه رو دور گردن پیچوندنه چون جواب فقط یک کلمه کلیدی قبل از تعریف آرایه ست.(اگه خواستین بدونین میتونید از خود تاپیک زننده بپرسید چون من به هزار و یک دلیل نمیخوام در اینجا روش رو بگم)
نکته دوم در مورد این قسمت هست:


تا جایی که میدانیم احتمالا داریم سوال یک مبدتی کار را جواب میدیم
اگر شما به هردو زبان VB و C#‎ اشنایی کامل داشته باشید حتما متوجه میشدید که این نوع بکارگیری آرایه ها و تغییر ساز کار یک برنامه نویس مبتدی نیست.
ضمنا به جای خرده گرفتن به روشهای دیگران فقط پاسخ رو بدین دوستان و از اظهار نظر در مورد توانایی های دیگران خودداری کنید .
من جواب ایشون رو دادم نه نیاز به به استفاده از جنریک ها(طبق اصول حرفه ای که شما میگید) و نه ایجاد و کپی و ... برای تغییر سایز.
در نهایت پاسخ جناب corona (http://barnamenevis.org/forum/member.php?u=38135) رو بهتر از همه ارزیابی میکنم.
در Syntax زبان C#‎ کلمه کلیدی جدید برای اینکار در نظر گرفته شده که میتونید در کتاب برادران Deitel بخونید.
موفق و پیروز باشید

اَرژنگ
یک شنبه 12 مهر 1388, 17:10 عصر
اگر شما به هردو زبان VB و C#‎‎ اشنایی کامل داشته باشید حتما متوجه میشدید که این نوع بکارگیری آرایه ها و تغییر ساز کار یک برنامه نویس مبتدی نیست.
ضمنا به جای خرده گرفتن به روشهای دیگران فقط پاسخ رو بدین دوستان و از اظهار نظر در مورد توانایی های دیگران خودداری کنید .
من جواب ایشون رو دادم نه نیاز به به استفاده از جنریک ها(طبق اصول حرفه ای که شما میگید) و نه ایجاد و کپی و ... برای تغییر سایز.
در نهایت پاسخ جناب corona (http://barnamenevis.org/forum/member.php?u=38135) رو بهتر از همه ارزیابی میکنم.
در Syntax زبان C#‎‎ کلمه کلیدی جدید برای اینکار در نظر گرفته شده که میتونید در کتاب برادران Deitel بخونید.
موفق و پیروز باشید

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

با تشکر از این کاربر که از یادگرفتن ما که چرا نمیتونند از لیست ژنریک استفاده بشه کمک کردند.

فقط ایشان نیستند که جواب میخواهند، ما هم شرایط درست بودن جوابی که میخواهیم بفرستیم را میخواهیم.

اَرژنگ
یک شنبه 12 مهر 1388, 17:26 عصر
فراموش کردم که بگم:
وقتی که پرسیدم چرا از لیست ژنریک استفاده نمیکنند برایه این است که معمولا از وجودشان خبر ندارند.
از ۲ خط کدی هم فرستادند معلوم نبود که کد خودشان است. معمولا مبتدی‌کارها حتی به خودشان زحمت اینکه جواب سوالی کسی را سعی میکنه بهش کمک کند بده. اینکه چرا از لیست استفاده نمیکنند را به سادگی میتونستند جواب بدن:
۱.باید از آرایه استفاده بشه به دلیل اینکه ...
۲.از وجود لیستهایه ژنریک خبر ندارند .

در لینکی که فرستادم، دقیقا همین سوال را یکی پرسیده و جوابش هم استفاده از لینکهایه ژنریک بود.

اگر اینکه ایشان به یک سوال ساده نمیتوانند جواب بدن ، باید مبتید بودنشان را استنباط کنیم و جوابمان را بر همان حساب بفرستیم.

alireza_tavakol
یک شنبه 12 مهر 1388, 17:34 عصر
دوستان ابتدای امر بنده جواب ایشون رو دادم در همینجا(اما بعد فکری به ذهنم رسید تا پاسخ دهندگان به این سوال رو محکی زده باشم) به همین خاطر پاسخم رو حذف کردم

با تشکر از شما که واقعا دلسوزانه توی این سایت فعالیت می کنید:متعجب:اون وقت از این محک زدن چه نتیجه ای گرفتید:متفکر: اگه نتیجه مهمی است لطفا نتیجه این آمار گیری رو اعلام نمایید /با تشکر/


جواب فقط یک کلمه کلیدی قبل از تعریف آرایه ست.(اگه خواستین بدونین میتونید از خود تاپیک زننده بپرسید چون من به هزار و یک دلیل نمیخوام در اینجا روش رو بگم)

ظاهرا" جناب alireza_s_84 قصد کردن توی این تاپیک جواب رو ندهند واسه همین من خواهش میکنم اگه کسی می دونه باید چه کلمه کلیدی رو جلوی تعریف آرایه قید کنیم تا آرایه پویا از نظر size داشته باشیم ، توی این تاپیک بنویسه تا واسه مستند سازی تاپیک در آیند واسه دیگران مفید واقع بشه و من نوعی هم مشعوف گردم

در ضمن فکر نمی کنم موردی رو پیدا کنیم که نشه از لیست جنریک استفاده کرد و حتما ملزم به استفاده از آرایه باشیم ولی در اکثر مواقعی که نیاز به پیمایش زیاد داریم بهتر از آرایه ها استفاده کنیم چون سرعت بالا تری نسبت به لیست های جنریک دارن:چشمک:

در نهایت منم هم از جناب corona تشکر میکنم چون من از وجود Array.Resize خبر نداشتم و جواب ایشون رو بهتر از جواب خودم ارزیابی میکنم

alireza_s_84
یک شنبه 12 مهر 1388, 19:10 عصر
ایشان میتوانستند اینکه میتونند از لیست ژنریک را استفاده کنند و یا نه را هم به ما بگند. اینجا ما عادت کردیم که تازه‌کارها سوال بپرسند و از روشهایه اشتباه استفاده کنند.
تازه کار بودنشان را بنابر عادت فرض کردیم.
هنوزهم اینکه چرا از لیست ژنریک را نمیتوانند استفاده کنند را زحمت نکردن جواب بدن، اگر حالتی وجود دارد که نمیشه از لیست ژنریک استفاده بشه ما هم میخواهیم بدونیم، یک چیزه جدیدی یاد بگیریم.
اگر کسی انتظار دارد جواب درست بهش بدیم، حداقل باید سعی کنه به فهمیدن اینکه مشکلش چی هست کمک کنه.
فقط ایشان نیستند که جواب میخواهند، ما هم شرایط درست بودن جوابی که میخواهیم بفرستیم را میخواهیم.
جناب آرژنگ عزیز در مورد اینکه این کاربر با یک سوال بدون جزییات جواب میخوان شکی نیست و من هم با شما موافقم . اما من و شما چرا دیدگاهمون رو اینجور تغییر ندیم که «این کاربر به این خاطر اینقدر خلاصه گفتن که فکر میکنند همه دوستان حرفه ای هستند و نیازی به گفتن جزییات نیست!!!»
موفق باشید دوست گرامی

alireza_s_84
یک شنبه 12 مهر 1388, 19:15 عصر
با تشکر از شما که واقعا دلسوزانه توی این سایت فعالیت می کنید:متعجب:اون وقت از این محک زدن چه نتیجه ای گرفتید:متفکر: اگه نتیجه مهمی است لطفا نتیجه این آمار گیری رو اعلام نمایید /با تشکر/

نتیجه آمارگیری:
با مدعی مگویید اسرار عشق و مستی / تا عاقبت بمیرد در درد خودپرستی

nahid1388
یک شنبه 12 مهر 1388, 19:27 عصر
تا جایی که من در کورسهایه سی‌شارپ دانشگهای دیدم، برایه شروع کار از آرایه‌ها استفاده میکنند و حتی به استفاده از ژنریکها اشاره نمیشه، وقتی هم که وجودش بهشان میگیم، مطمعن نیستند که حتی اجازه استفاده از چیزه دیگری به جز چیزهایی که در کلاس بهشان یاد داند را دارند یا نه.
ایشان میتوانستند اینکه میتونند از لیست ژنریک را استفاده کنند و یا نه را هم به ما بگند. اینجا ما عادت کردیم که تازه‌کارها سوال بپرسند و از روشهایه اشتباه استفاده کنند.
تازه کار بودنشان را بنابر عادت فرض کردیم.
هنوزهم اینکه چرا از لیست ژنریک را نمیتوانند استفاده کنند را زحمت نکردن جواب بدن، اگر حالتی وجود دارد که نمیشه از لیست ژنریک استفاده بشه ما هم میخواهیم بدونیم، یک چیزه جدیدی یاد بگیریم.
اگر کسی انتظار دارد جواب درست بهش بدیم، حداقل باید سعی کنه به فهمیدن اینکه مشکلش چی هست کمک کنه.

با تشکر از این کاربر که از یادگرفتن ما که چرا نمیتونند از لیست ژنریک استفاده بشه کمک کردند.

فقط ایشان نیستند که جواب میخواهند، ما هم شرایط درست بودن جوابی که میخواهیم بفرستیم را میخواهیم.
آقای ارژنگ مرسی از پاسختون اما باور کنید من فکر می کردم با همون سوال کافیه تا پاسخم رو بگیرم و گرفتم .
وقتی من با این سوال پاسخ مورد نظرم رو بگیرم چرا بیخودی سوالم رو طولانی تر کنم؟؟؟
باز همه ی دوستان ممنونم که راهنمایی کردن.
ضمنا من تازه کار با #C رو آغاز کردم و تسلط کافی به VB دارم برای همین مجبور شدم این سوال رو بپرسم و گرنه در VB تا حالا نشده از کسی سوالی بپرسم:لبخند:
مرسی از همه دوستان

اَرژنگ
یک شنبه 12 مهر 1388, 21:58 عصر
آقای ارژنگ مرسی از پاسختون اما باور کنید من فکر می کردم با همون سوال کافیه تا پاسخم رو بگیرم و گرفتم .
وقتی من با این سوال پاسخ مورد نظرم رو بگیرم چرا بیخودی سوالم رو طولانی تر کنم؟؟؟
باز همه ی دوستان ممنونم که راهنمایی کردن.
ضمنا من تازه کار با C#‎ رو آغاز کردم و تسلط کافی به VB دارم برای همین مجبور شدم این سوال رو بپرسم و گرنه در VB تا حالا نشده از کسی سوالی بپرسم:لبخند:
مرسی از همه دوستان
سوال نپرسیدن هنر نیست، درست سوال پرسیدن هنر است.
آخرش هم به خودتان زحمت ندادید که سوال ما را جواب بدید که آیا واقعا با لیست ژنریک میتوانید کار کنید یا نه؟و اگر نه دلیلش چیه؟
روش درست سوال پرسیدن این است که یکی خوب تشریح کنه که کسی که میخواهد جواب بده درست جواب بده.

اَرژنگ
یک شنبه 12 مهر 1388, 22:07 عصر
جناب آرژنگ عزیز در مورد اینکه این کاربر با یک سوال بدون جزییات جواب میخوان شکی نیست و من هم با شما موافقم . اما من و شما چرا دیدگاهمون رو اینجور تغییر ندیم که «این کاربر به این خاطر اینقدر خلاصه گفتن که فکر میکنند همه دوستان حرفه ای هستند و نیازی به گفتن جزییات نیست!!!»
موفق باشید دوست گرامی
حرفه‌ای بودن به این نیست که با ندانستن آدم جواب بده، تا حالا کدام دکتر رفتید که فقط با نگاه به مریض بگه چشه؟ در ضمن یکی از جزویات جواب این بود که محتویات پاک نشه، این روش Array.Resize یک کپی جدید میسازه و محتویات قبلی را آزاد میکنه.
و هنوز هم نگفتن چرا باید آرایه باشد تا لیست ژنریک، اگر بر دلیلی هست، چرا ما هم ندانیم؟
در ضمن هر جایه حرفه‌ای که دیدم، لیست ژنریک را به آرایه ترجیح میدن. اگر که میگن باید آرایه باشه به چه دلیلی؟
و اینکه محتویات نباید پاک بشه، پس چرا روشی که محتویات را کپی میکنه و پاک میکنه را به عنوان جواب قبول کردن؟
ضد و نقیضی کار کردن که نمیشه.

با اینکه از نوع طرز تفکری که گفتید بیشتر خوشم میاد، چه جوری به کاربر برسانیم که هر چقدر بیشتر اطلاعات در مورد سوالشان در اختیار بقیه بزارند باشد جوابی که بهتر به سوال اصلیشان بخوره میگیرند؟

چرا یکی مثل جناب سعید معصومی داریم که جوابش هیچ جایه سوالی برایه فهمیدن باقی نمیگزاره و بعضیها حتی وقتی که ازشان در مورد سوالشان میپرسیم بیشتر جواب نمیدن؟


شما هم موفق باشید دوست گرامی

اَرژنگ
یک شنبه 12 مهر 1388, 22:13 عصر
ولی در اکثر مواقعی که نیاز به پیمایش زیاد داریم بهتر از آرایه ها استفاده کنیم چون سرعت بالا تری نسبت به لیست های جنریک دارن:چشمک:

این حالت به ندرت پیش میاد، و هنوز نتونستم یک مثال که این حالت را نشان بده پیدا کنم.



در نهایت منم هم از جناب corona تشکر میکنم چون من از وجود Array.Resize خبر نداشتم و جواب ایشون رو بهتر از جواب خودم ارزیابی میکنم

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

alireza_tavakol
دوشنبه 13 مهر 1388, 00:09 صبح
این حالت به ندرت پیش میاد، و هنوز نتونستم یک مثال که این حالت را نشان بده پیدا کنم.

اون طوری که من توی کتاب جناب قلزم خوانده ام گفته شده که سلول های آرایه در RAM به صورت فیزیکی در کنار هم قرار دارند و با داشتن آدرس شروع آرایه و اندیس خانه مورد نظر خیلی سریع می توان به خانه مرود نظر پیمایش کرد ( دسترسی مستقیم ) ولی در لیست ها هر خانه اشاره گر به خانه بعدی دارد پس در این حالت برای رسیدن به اندیس X باید به تعداد X بار به حافظه مراجعه کنیم تا به خانه مورد نظر دسترسی پیدا کنیم ( اتلاف وقت )


Array.Resize از جواب شما مختصرتر است ولی اشکالی که در یکی از پستها فرستادند این بود که محتویات پاک نشه، این Array.Resize یک کپی جدید با یک سایز جدید درست میکنه.
در ضمن همان روش وی‌بی هم یک کپی جدید با سایز جدید درست میکنه.
بعد از این ضد و نقیضها نتیجه سوال و جواب چی شد؟
به نظر شما چه اشکالی داره که یک کپی جدید از آرایه درست بشه ما نیاز داریم size آرایه رو تغییر بدیم و اطلاعاتی قبلی حفظ شود پس حالا اگه کپی جدیدی درست بشه فکر نمی کنم ایرادی داشته باشه.

اگه توی این دو مورد اشتباه می کنم لطفا بنده رو مطلع فرمایید با تشکر از همه دوستان:لبخندساده:

alireza_tavakol
دوشنبه 13 مهر 1388, 02:18 صبح
آخرش هم به خودتان زحمت ندادید که سوال ما را جواب بدید که آیا واقعا با لیست ژنریک میتوانید کار کنید یا نه؟و اگر نه دلیلش چیه؟

جناب اَرژنگ من روی این قضیه خیلی فکر کردم و واسه این سوال به این جواب رسیدم:کف:

شما فرض بفرمایید که قرار از یک آرایه n بعدی استفاده کنیم که به صورت نا معلوم طول ابعادش تغییر می کند ، قطعا راه حل پیشنهادی شما برای این مسئله استفاده از لیست جنریک است ، چون آرایه با طول نا معلوم مطرح شده و شما اعتقاد دارین لیست جنریک برای حل این معضل مناسب است!

حل من از شما سوال می کنم آیا پیاده سازی لیست جنریک 7 بعدی به راحتی پیاده سازی آرایه 7 بعدی است؟
آیا میشه آرایه 7 بعدی Rectangular رو با لیست جنریک پیاده سازی کرد به نحوی که محدود به 7 بعد باشیم و هر بعد محدود به 5 عضو باشد ( البته تا وقتی این طوری تعریف شده این محدودیت وجود داشته باشه و وقتی طول ابعاد به 10 بعد و طول هر بعد به 8 سلول تغییر کرد محدودیتی به این شکل به وجود آید تا از دسترسی و خطای احتمالی جلوگیری شود):متفکر: در ضمن از خوانایی برنامه هم کاسته نشود:لبخند:

اگر جواب این دو سوال من مثبت ارزیابی می شود ، لطفا" این مثل رو به عنوان یک فرآیند عملیاتی در چند خط کد پیاده سازی نمایید

با تشکر:لبخندساده:

اَرژنگ
دوشنبه 13 مهر 1388, 10:11 صبح
شما فرض بفرمایید که قرار از یک آرایه n بعدی استفاده کنیم که به صورت نا معلوم طول ابعادش تغییر می کند ، قطعا راه حل پیشنهادی شما برای این مسئله استفاده از لیست جنریک است ، چون آرایه با طول نا معلوم مطرح شده و شما اعتقاد دارین لیست جنریک برای حل این معضل مناسب است!


بستگی دارده! ما اول باید نیامندیهایه مسئله را بدانیم و بعدش اینکه از چی استفاده بشه را تصمیم بگیریم، من با استفاده از آرایه مشکلی ندارم، ولی اینکه وقتی یکی دارد خواصی را که لیست ژنریک حاظر آماده دارد را میخواهد با اضافک کردن کد با آرایه داشته باشد را مشکل دارم.
اگر بخواهم یک کلاس ماتریکس بنویسم، ترجیح میدم که از یک آرایه ۲ بعدی استفاده کنم (private داخل کلاس).



حل من از شما سوال می کنم آیا پیاده سازی لیست جنریک 7 بعدی به راحتی پیاده سازی آرایه 7 بعدی است؟

اینکه تنبلی را با راحتی اشتباه نگرییم مهم است.از چه لحاظ سخته ؟ مگه باید از کوه رفت بالا؟
ولی راحتی پیاده سازی فقط یکبار مسئله است، راحتی استفاده کردن بارها مهمتر از راحتی پیاده کردن است و برایه مدت بیشتری دوام میاره.


آیا میشه آرایه 7 بعدی Rectangular رو با لیست جنریک پیاده سازی کرد به نحوی که محدود به 7 بعد باشیم و هر بعد محدود به 5 عضو باشد ( البته تا وقتی این طوری تعریف شده این محدودیت وجود داشته باشه و وقتی طول ابعاد به 10 بعد و طول هر بعد به 8 سلول تغییر کرد محدودیتی به این شکل به وجود آید تا از دسترسی و خطای احتمالی جلوگیری شود):متفکر: در ضمن از خوانایی برنامه هم کاسته نشود:لبخند:


محدودیتهایی که گفتید را من به عنوان لزومیته ارزیابی میکنم، اگر اینکه محدودیتی به این شکل به وجود آید تا از دسترسی و خطای احتمالی جلوگیری شود واقعا مهم است، آرایه اصلا برایه اینکار نیست، چونکه با آرایه چطوری میشه این محدودیت را داشت؟
اگر ابعاد قرار است که واقعا ثابت بمانند، و فرظ کنیم که جلوگیری از دسترسی و خطای احتمالی واقعا مهم است، یک کلاس خیلی بخصوص برایه اینکار باید بوجود آورد.



اگر جواب این دو سوال من مثبت ارزیابی می شود ، لطفا" این مثل رو به عنوان یک فرآیند عملیاتی در چند خط کد پیاده سازی نمایید

محدویتهایه که لازم دارید و شرئطی که باید حفاظت بشند، با هیچ روش چند خطی قابل پیاده شدن نیستند.
چه با آرایه چه با لیست ژنریک، این یک حالت زیادی بخصوصه، اینکه از آرایه یا لیست استفاده بشه بی اهمیت است.
داخلا ممکن است که از هر چیزی استفاده کنیم، ولی در برنامه نویسی شئیگرا داخل یک شئی مهم نیست، اینکه این شئی چه هست و چه وظایفی دارد مهم است.
من هم میتونم یک مثال بزنم که تمام خاصیتهایه آرایه را لازم داشته باشه، و خصوصیتهایه لیست را نداشته باشه، بعدش بگم که پیاده کردن این با آرایه راحت تره یا با لیست! :لبخند:

چیزی که تعریف کردید یکمی اختصاصی، و بنابر روشهایه مختلفی که قراره استفاده بشه به جایه استفاده از آرایه چند بعدی ،بهتر این است که یک کلاس اختصاصی استفاده بشه، در این حالت کنترل بیشتری به استفاده‌اش خواهیم داشت.
آرایه و لیست ژنریک جزوه چیزهایی محسوب میشند که در زبان (برنامه‌نویسی) بهشان میگیم ساختارهایه ابتدائی (primitive constructs), از اینها برایه ساختن ساختارهایه پیچیده تر کمک گرفته میشه.
همان مثال داشتن یک آرایه n بعدی، هدف نیست. هدف این است که یک چیزی که قابلیت نگه داشتن n بعد را داشته باشه، داشته باشیم.
یک مثل هست که میگه، هر کی یک چکش دارد، همه چی را میخ میبینه. متاسفانه کتبهایی که آرایه را یاد میدن، فراموش میکنند که اضافه کنند که آرایه چکش نیست، فقط دسته چکشه، و میشه که در یک کلاس برایه پیاده کردن مفاهیم استفاده بشه.
حالا اشکال سوالی که پرسیدید این هست که از طراحی اینکه با چی کار میکنیم صرف نظر کرده و اینکه چطوری باید پیاده بشه را نگاه میندازه.
این حالت برمیگرده به برنامه‌نویسی قبل از شئیگرا، که نحوه انجام مهم بود. در برنامه نویسی شئیگرا باید اول بپرسیم که این شئی که لازم داریم چی هست؟ برایه چه کاری استفاده میشه؟ کلاینتهاش در چه شکلی باید باهاش اینترفیس کنند.
مثلا همین که ممکن است که بعضی از عنصرهایه این ابجکت، یک بعدی، دو بعدی ، ... ، ۱۰۰ بعدی باشند را میشه با آرایه پیاده کرد؟ و قوانینی در اضافه کردن و کم کردن از بعضیا از عنصرها باید رعایت بشه؟

اگر به طراحیش نگاه بندازید میبینید که آرایه اصلا برایه این کار کافی نیست، حتی اینکه در راحتی میشه یک آرایه چند بعدی نوشت، ولی ما داریم برعکس کار میکنیم، اول آرایه را برایه حل اینکار انتخواب کردیم و داریم سعی میکنیم که بزور به شکلی که نیازمندیها را برطرف کنه باهاش کار کنیم.

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

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

اینکه لیست چند بعدی تعریف کردن از آرایه استفاده کردن آسانتر است و یا نه کاره بیهوده‌ایه. و جوابش برایه تفریح خوبه ولی در اصول کار کردن پیش نمیاد.

در سی‌شارپ ۴ ، کلاس تاپل برایه همین اضافه شده:


Tuple<string, int> t = new Tuple<string, int>("Hello", 4)
ولی اینکه راحتی استفاده‌اش مانند استفاده از یک آرایه چند بعدی است، بی اهمیته.

اَرژنگ
دوشنبه 13 مهر 1388, 11:44 صبح
اگر بخواهم یک کلاس ماتریکس بنویسم، ترجیح میدم که از یک آرایه ۲ بعدی استفاده کنم (private داخل کلاس).

این روش، روش اشتباه غیره شئیگراییست، روش بهتر در این لینک اراعه داده شده:
http://www.codeproject.com/KB/recipes/dynmatrixmath.aspx

alireza_tavakol
دوشنبه 13 مهر 1388, 14:28 عصر
جناب اَرژنگ متشکر که دیدگاه های علمی تون رو بیان کردین

یک سوالی که بعد از خواندن جملات شما به ذهن من خطور کرد !

آیا می توان ابعاد آرایه رو به صورت RunTime تغییر داد؟مثلا" در مرحل اول آرایه رو به صورت زیر تعریف کنیم

int[] a = new int[] { 0, 1, 2 };
و در جای دیگر برنامه همین آرایه a رو به یک آرایه دو بعدی تبدیل کنیم به شکل زیر

a = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
البته به این روش که من پیاده سازی کردم Error داد و نشد ! اگه راهی برای این کار وجود داره راهنمایی نمایید. با تشکر

اَرژنگ
دوشنبه 13 مهر 1388, 15:23 عصر
جناب اَرژنگ متشکر که دیدگاه های علمی تون رو بیان کردین

یک سوالی که بعد از خواندن جملات شما به ذهن من خطور کرد !

آیا می توان ابعاد آرایه رو به صورت RunTime تغییر داد؟مثلا" در مرحل اول آرایه رو به صورت زیر تعریف کنیم

int[] a = new int[] { 0, 1, 2 };و در جای دیگر برنامه همین آرایه a رو به یک آرایه دو بعدی تبدیل کنیم به شکل زیر

a = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };البته به این روش که من پیاده سازی کردم Error داد و نشد ! اگه راهی برای این کار وجود داره راهنمایی نمایید. با تشکر

فرض کنیم که این خصوصیت را که بشه ابعاد را تغییر بدید لازم دارید، چرا از آرایه استفاده میکنید؟


List<List<int>>
کافیه برایه اینکار.

در ضمن حتی اگر بشه ابعاد را تغییر بدیم، منطقی هست که دلیلش را بتونیم توجیح کنیم؟