به نظر شما راهی برای فرار از حلقه for وجود داره ؟ یه برنامه نوشتم همش مجبور به استفاده از حلقه for یا foreach شدم. نزدیک به 10یا 11 تا حلقه طولانی و تو درتو.، بررسی کردنش هم مشکله.
به نظر شما راهی برای فرار از حلقه for وجود داره ؟ یه برنامه نوشتم همش مجبور به استفاده از حلقه for یا foreach شدم. نزدیک به 10یا 11 تا حلقه طولانی و تو درتو.، بررسی کردنش هم مشکله.
خلاصه برنامه :در یک فایل اکسل چند تا شیت داریم (1حلقه) توی هر شیت چند ردیف اسامی پرسنل و شیفتهایشان(1حلقه ) نوشته شده . برای هر روز (1حلقه ) باید بررسی بشن که از این پرسنل فقط افرادی که مد نظر هستن(1 حلقه) تعداد شیفتهای خاص (1 حلقه) آنها را انتخاب کرده بر اساس میزان اضافه کاریشان (حلقه ) و در فایل اکسل دیگر با چند تا شیت (حلقه ) همین افراد(حلقه) در هر روز (حلقه) نوشته شوند.
که البته حلقه های دیگری که کوچک هستند خواه ناخواه در دل برنامه استفاده میشن.
برای جلوگیری از تو در تو شدن زیاد، از متد استفاده کنید.حلقه های داخلی رو (هر کدوم مناسب برای متد شدن هستن) توی متد بنویسید و توی حلقه خارجی فراخوانیشون کنید.مثلا متد محاسبه اضافه کاری...
به طور معمول بهتره حلقه شما بیشتر از 3 سطح تو در تو نباشه.
حرف شما متین. من هم سعی کردم اینکار رو بکنم . اما میخوام بدونم آیا میشه یه حلقه رو کلا به روشی دیگر نوشت. مثال میزنم توی sql از select برای انتخاب فیلد مورد نظر استفاده میکنیم که ما نیازی به ایجاد حلقه نداریم .و خود بانک حالا به هر روشی که خودش انجام میده فیلد مورد نظر ما رو بهمون میده.(این یه مثاله. موضوع من ربطی به sql نداره فقط برای تفهیم مسئله است) آیا توی برنامه نویسی هم میشه به جای حلقه که ما رو به نام موردنظر برسونه از دستوری مشابه استفاده کنیم؟ این اسامی رو توی چیزی به غیر آرایه بریزیم و از دستوراتی استفاده کنیم که نیاز به ایجاد حلقه نباشه.
حلقه را میشه با توابع بازگشتی شبیه سازی کرد
از datatable يا dataview استفاده كني ميشه select رو زد
توی #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 مراجعه کنید.
مثال فاکتوریل :
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());
}
اطلاعات رو در چه ساختاری نگهداری میکنید؟
به نظر من هم اگر اطلاعات رو داخل دیتاتیبل یا دیتاست لود کنید به راحتی میتونید اونو فیلتر کنید و نتیجه رو ذخیره کنید.
کد لود اطلاعات رو قرار بدید تا دوستان بررسی کنند.
مگه شما برای خوندن اطلاعات فایل اکسلت از چه روشی استفاده می کنی ؟
من که برای خوندشون از روش زیر استفاده می کنیم که با این روش میشه برای 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()
دوستان ببخشید اینترنتم دیشب قطع شد. این چند تا از کدها. برای اتصال به اکسل :
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;
این هم برای خواندن نام شیتها و . . .
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;
دوستان چی شد ادامه نمیدید؟
ی پیشنهاد وسط بحثتون: تا جایی ک می شه از کامپوننتهای COM استفاده نکنید.
(دلیل هم زیاد داره)
دنبال معادل .net ایش بگردین همیشه اگه می شه از اون استفاده کنید.