PDA

View Full Version : سوال: راه فرار از حلقه for ؟



csharpdoost
چهارشنبه 18 بهمن 1391, 10:40 صبح
به نظر شما راهی برای فرار از حلقه for وجود داره ؟ یه برنامه نوشتم همش مجبور به استفاده از حلقه for یا foreach شدم. نزدیک به 10یا 11 تا حلقه طولانی و تو درتو.، بررسی کردنش هم مشکله.

اوبالیت به بو
چهارشنبه 18 بهمن 1391, 11:04 صبح
به نظر شما راهی برای فرار از حلقه for وجود داره ؟ یه برنامه نوشتم همش مجبور به استفاده از حلقه for یا foreach شدم. نزدیک به 10یا 11 تا حلقه طولانی و تو درتو.، بررسی کردنش هم مشکله.
درود بر شما

سیستم شما چه کار قرار انجام بده؟ اون قسمتی که حلقه گذاشتید وظیفش چیه؟

csharpdoost
چهارشنبه 18 بهمن 1391, 11:24 صبح
خلاصه برنامه :در یک فایل اکسل چند تا شیت داریم (1حلقه) توی هر شیت چند ردیف اسامی پرسنل و شیفتهایشان(1حلقه ) نوشته شده . برای هر روز (1حلقه ) باید بررسی بشن که از این پرسنل فقط افرادی که مد نظر هستن(1 حلقه) تعداد شیفتهای خاص (1 حلقه) آنها را انتخاب کرده بر اساس میزان اضافه کاریشان (حلقه ) و در فایل اکسل دیگر با چند تا شیت (حلقه ) همین افراد(حلقه) در هر روز (حلقه) نوشته شوند.
که البته حلقه های دیگری که کوچک هستند خواه ناخواه در دل برنامه استفاده میشن.

plus
چهارشنبه 18 بهمن 1391, 15:56 عصر
برای جلوگیری از تو در تو شدن زیاد، از متد استفاده کنید.حلقه های داخلی رو (هر کدوم مناسب برای متد شدن هستن) توی متد بنویسید و توی حلقه خارجی فراخوانیشون کنید.مثلا متد محاسبه اضافه کاری...
به طور معمول بهتره حلقه شما بیشتر از 3 سطح تو در تو نباشه.

csharpdoost
چهارشنبه 18 بهمن 1391, 17:37 عصر
برای جلوگیری از تو در تو شدن زیاد، از متد استفاده کنید.حلقه های داخلی رو (هر کدوم مناسب برای متد شدن هستن) توی متد بنویسید و توی حلقه خارجی فراخوانیشون کنید.مثلا متد محاسبه اضافه کاری...
به طور معمول بهتره حلقه شما بیشتر از 3 سطح تو در تو نباشه.
حرف شما متین. من هم سعی کردم اینکار رو بکنم . اما میخوام بدونم آیا میشه یه حلقه رو کلا به روشی دیگر نوشت. مثال میزنم توی sql از select برای انتخاب فیلد مورد نظر استفاده میکنیم که ما نیازی به ایجاد حلقه نداریم .و خود بانک حالا به هر روشی که خودش انجام میده فیلد مورد نظر ما رو بهمون میده.(این یه مثاله. موضوع من ربطی به sql نداره فقط برای تفهیم مسئله است) آیا توی برنامه نویسی هم میشه به جای حلقه که ما رو به نام موردنظر برسونه از دستوری مشابه استفاده کنیم؟ این اسامی رو توی چیزی به غیر آرایه بریزیم و از دستوراتی استفاده کنیم که نیاز به ایجاد حلقه نباشه.

wolf_majid
چهارشنبه 18 بهمن 1391, 17:53 عصر
حلقه را میشه با توابع بازگشتی شبیه سازی کرد

hamid_hr
چهارشنبه 18 بهمن 1391, 17:55 عصر
از datatable يا dataview استفاده كني ميشه select رو زد

plus
چهارشنبه 18 بهمن 1391, 17:56 عصر
توی #C ، با استفاده از LINQ میتونید به روش دیگه ای کار های تکراری رو انجام بدین که تا حدی کار با حلقه ها رو ساده تر میکنه.LINQ ماجرای طولانی داره میتونید در موردش جستجو کنید من فقط یک مثال میزنم براتون
فرض کنید یک آرایه از Student داریم و میخواهیم اونایی که ID شون زوج هست رو انتخاب کنیم:

Student[] students = new Student[] { .... };

Student[] result = students.Where( student => student.Id % 2 == 0).ToArray();
// OR
Student[] result = (from Student student in students
where student.Id % 2 == 0
select student).ToArray();

عبارتی که داخل پارنتز اول میبینید هم یک Lamba Expression (عبارت لاندا) هست، در مورد این هم میتونید جستجو کنید و یا به MSDN مراجعه کنید.

csharpdoost
چهارشنبه 18 بهمن 1391, 18:26 عصر
حلقه را میشه با توابع بازگشتی شبیه سازی کرد
میشه بیشتر توضیح بدید. چطوری ؟ میتونید یه مثال بزنید؟

csharpdoost
چهارشنبه 18 بهمن 1391, 18:30 عصر
از datatable يا dataview استفاده كني ميشه select رو زد

تا اونجا که میدونم datatable مربوط به بانکه. حرف من بیشتر توی خود برنامه است . یعنی منظور شما اینه که datatable رو میشه برای اطلاعاتی که از یه غیر از بانکه استفاده کرد؟ اگه میشه چطوری؟

wolf_majid
چهارشنبه 18 بهمن 1391, 18:34 عصر
میشه بیشتر توضیح بدید. چطوری ؟ میتونید یه مثال بزنید؟

مثال فاکتوریل :

private int fac(int num)
{
if (num == 1 || num==0)
return 1;
return num*fac(num - 1);
}


private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(fac(5).ToString());
int sum = 1;
for (int i = 1; i <= 5; i++)
{
sum *= i;
}
MessageBox.Show(sum.ToString());
}

Mahmoud.Afrad
چهارشنبه 18 بهمن 1391, 23:07 عصر
اطلاعات رو در چه ساختاری نگهداری میکنید؟
به نظر من هم اگر اطلاعات رو داخل دیتاتیبل یا دیتاست لود کنید به راحتی میتونید اونو فیلتر کنید و نتیجه رو ذخیره کنید.
کد لود اطلاعات رو قرار بدید تا دوستان بررسی کنند.

mc_laren
چهارشنبه 18 بهمن 1391, 23:45 عصر
مگه شما برای خوندن اطلاعات فایل اکسلت از چه روشی استفاده می کنی ؟
من که برای خوندشون از روش زیر استفاده می کنیم که با این روش میشه برای Select شرط بذاری و داده های دلخواهت رو برگردونی


Dim StrCnn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" + FilePath + ";" & _
"Extended Properties=""Excel 8.0;HDR=YES"""


Dim olecnn As New OleDbConnection(StrCnn)
Dim oleda As New OleDbDataAdapter("Select * from [Sheet1$]", olecnn)
Dim Dst As New DataSet
olecnn.Open()
oleda.Fill(Dst, "Sheet1")
olecnn.Close()
olecnn.Dispose()

csharpdoost
پنج شنبه 19 بهمن 1391, 07:57 صبح
مثال فاکتوریل :

private int fac(int num)
{
if (num == 1 || num==0)
return 1;
return num*fac(num - 1);
}


private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(fac(5).ToString());
int sum = 1;
for (int i = 1; i <= 5; i++)
{
sum *= i;
}
MessageBox.Show(sum.ToString());
}

ببخشید اینترنتم دیشب قطع شد.
این کدها مربوط به اعداده . در مورد رشته ها هم میشه چنین کاری کرد؟

csharpdoost
پنج شنبه 19 بهمن 1391, 08:02 صبح
دوستان ببخشید اینترنتم دیشب قطع شد. این چند تا از کدها. برای اتصال به اکسل :



Worksheet worksheetbarname, worksheet110_99_88_1
Range range_radif
object mis = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application ExcelAppbarnameh = new Microsoft.Office.Interop.Excel.Application();

ExcelAppbarnameh.Visible = false;
System.Threading.Thread.CurrentThread.CurrentCultu re = new System.Globalization.CultureInfo("en-US");

Microsoft.Office.Interop.Excel.Application ExcelApp_110_99_88 = new Microsoft.Office.Interop.Excel.Application();

ExcelApp_110_99_88.Visible = false;
System.Threading.Thread.CurrentThread.CurrentCultu re = new System.Globalization.CultureInfo("en-US");


//باز کردن برنامه اصلی یا همان برنامه شیفتی پرسنل
Workbook workbook_barnameh = ExcelAppbarnameh.Workbooks.Open(FileName_barnameh, mis, mis, mis, mis, mis,
mis, mis, mis, mis, mis, mis, mis, mis, mis);
Sheets sheetsbarnameh = workbook_barnameh.Worksheets;

//باز کردن اکسل دومی یا همان 110_99_88
Workbook workbook110_99_88 = ExcelApp_110_99_88.Workbooks.Open(FileName110_99_8 8, mis, mis, mis, mis,
mis, mis, mis, mis, mis, mis, mis, mis, mis, mis);
Sheets sheets110_99_8 = workbook110_99_88.Worksheets;

csharpdoost
پنج شنبه 19 بهمن 1391, 08:10 صبح
این هم برای خواندن نام شیتها و . . .


string namesheet = "";
int Countsheetbarname = 12;
for (int t = 1; t <= Contsheetbarname; t++)//خواندن نام شیتها در برنامه اصلی
{
int q = 0;
worksheetbarname = (Worksheet)sheetsbarnameh.get_Item(t);
namesheet = worksheetbarname.Name;
if (namesheet != "جراحی" && namesheet != "اورژانس" && namesheet != "بیهوشی" && namesheet != "CCU")
continue;
else
{
// شیت اول کد 99
worksheet110_99_88_1 = (Worksheet)sheets110_99_8.get_Item(4);
//شیت دوم کد 99
worksheet110_99_88_2 = (Worksheet)sheets110_99_8.get_Item(5);


range_radif1 = (Range)worksheetbarname.get_Range("B" + 7, "B" + 26);
System.Array valuearray_radif1 = (System.Array)range_radif1.Value2;

csharpdoost
پنج شنبه 19 بهمن 1391, 15:53 عصر
دوستان چی شد ادامه نمیدید؟

wolf_majid
پنج شنبه 19 بهمن 1391, 16:20 عصر
ببخشید اینترنتم دیشب قطع شد.
این کدها مربوط به اعداده . در مورد رشته ها هم میشه چنین کاری کرد؟

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

کد حلقه ات را بگذار تا بررسی کنم

RED-C0DE
پنج شنبه 19 بهمن 1391, 19:26 عصر
ی پیشنهاد وسط بحثتون: تا جایی ک می شه از کامپوننتهای COM استفاده نکنید.
(دلیل هم زیاد داره)
دنبال معادل .net ایش بگردین همیشه اگه می شه از اون استفاده کنید.