PDA

View Full Version : سوال: نحوه رفتن از یک حلقه foreach به حلقه foreach دیگر



esafb52
جمعه 25 اسفند 1391, 14:44 عصر
با سلام
چطور میتونم هربار که این دو حلقه اجرا میشن باز برنامه برگرده به حلقه اول foreach و بعد بره به حلقه دوم foreach و تا اتمام عناصر حلقه این کار ادامه پیدا کنه؟
یا چطور میشه تو یه حلقه foreach دو تا آیتم رو همزمان خوند و تو دونا متغییر قرار داد؟؟؟؟؟؟
آیا میشه از goto استفاده کرد؟؟


foreach (var item in collection)
{
foreach (var item in collection)
{

}

}

mehrdad1991h
جمعه 25 اسفند 1391, 15:07 عصر
شما فهمیدی چی گفتی ؟

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

در مثال خودت که دوتا حلقه را در هم قرار دادی اگر میخوای مثلا وسط کار حقه وسطی متوقف بشه و حلقه بالایی دوباره کار کنه خوب تو حلقه وسطی بنویس اگر فلان اتفاق رخ داد(اتفاق مد نظرت) beak اینجوری حلقه وسطی قطع میشه بر میگرده حلقه قبلی

اصلا من نفهمیدم میخوای چی کار کنی واقعا ؟

linux
جمعه 25 اسفند 1391, 15:48 عصر
با سلام
چطور میتونم هربار که این دو حلقه اجرا میشن باز برنامه برگرده به حلقه اول foreach و بعد بره به حلقه دوم foreach و تا اتمام عناصر حلقه این کار ادامه پیدا کنه؟
یا چطور میشه تو یه حلقه foreach دو تا آیتم رو همزمان خوند و تو دونا متغییر قرار داد؟؟؟؟؟؟
آیا میشه از goto استفاده کرد؟؟


foreach (var item in collection)
{
foreach (var item in collection)
{

}

}

بهتر نیست بگی می‌خواهی چکار کنی؟ شاید راه‌حل ساده‌تری هم داشته باشد

esafb52
جمعه 25 اسفند 1391, 16:00 عصر
با سلام من اطلاعات لازمم رو از تو عدد لیست باکس میخونم و با دو تا حلقه اونها رو میریزم تو دو تا متغییر
بعدش هم وارد دیتابیس میکنم اما خیلی هنگ میکنه و سرعت کمه تو حلقه ای داخلی من اطلاعات رو تو تیبل میریزم اما مشکل اینه که وقتی که وارد حلقه دوم شد یکی از عناصرمن تو حلقه اول جا میمونه و مقادیر تکراری درج میشه با بریک هم نشد؟؟!!!!!!!!!!!

foreach (object item in listBox1.Items)
{

string mas = item.ToString();

foreach (object itema in listBox2.Items)
{
string bb = itema.ToString();

}
}

FastCode
جمعه 25 اسفند 1391, 16:12 عصر
هدف نهایی رو توضیح بده.
یک مقدار بیشتر کد بزار.
خیلی بد توضیح دادین

esafb52
جمعه 25 اسفند 1391, 16:21 عصر
با سلام مجدد خیلی ساده و روشن سعی میکنم توضیح بدم
من دارم یه برنامه برای مدیریت فایل ها مینویسم و میخوام مثلا یک پوشه رو بهش بدم و تمام فایلهای مثل با پسوند pdf رو تو لیست باکس بریزم از این لیست باکس من دوتا چیز میخوام:
1-مسیر فایل به طور کامل
2-اسم فایل بدون پسوند
و بعد درج در دیتابیس
کد برنامه :

FolderBrowserDialog FbD = new FolderBrowserDialog();
FbD.SelectedPath = "";
if (FbD.ShowDialog()==DialogResult.OK)
{
pa = FbD.SelectedPath;
label1.Text = pa;
ss = Directory.GetFiles(pa,"*.pdf");
listBox1.Items.AddRange(ss);
DirectoryInfo di = new DirectoryInfo(pa);
FileInfo[] fi = di.GetFiles("*.pdf");
listBox2.Items.AddRange(fi);
}


و اینم کد درج :

foreach (object item in listBox1.Items)
{

string mas = item.ToString();

foreach (object itema in listBox2.Items)
{
string bb = itema.ToString();

cmd.CommandText = "INSERT INTO tbbook (bookname,author,subject,motarjem,masir) values(@1,@2,@3,@4,@5)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@1", bb);
cmd.Parameters.AddWithValue("@2", a);
cmd.Parameters.AddWithValue("@3", b);
cmd.Parameters.AddWithValue("@4", c);
cmd.Parameters.AddWithValue("@5", mas);
iud(cmd);

}
}

esafb52
جمعه 25 اسفند 1391, 19:59 عصر
از دوستان کسی راهنمایی نمیکنه؟؟

FastCode
جمعه 25 اسفند 1391, 20:30 عصر
حلقه اول رو بردار و به جای mas از itema.FullName (http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.fullname.aspx) استفاده کن.

C#‎_best_Programmer
جمعه 25 اسفند 1391, 20:49 عصر
داشم چرا عادت کردین به برنامه نویسی به دید کد نگاه می کنین پس خلاقیت و حل مسله کجاست اگه یه کمی روش فک کنی بد نیست:اشتباه:

esafb52
جمعه 25 اسفند 1391, 21:14 عصر
با سلام منظورتون رو نفهمیدم که چطور از itema.FullName (http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.fullname.aspx) استفاده کنم الان با این کد زیر موفق شدم اما داره 6، 7 بار اضافه تو دیتابیس میریزه که نمی دونم چرا؟

foreach (object itemaa in listBox1.Items)
{
string mas = itemaa.ToString();
foreach (object item in listBox2.Items)
{
string bb = item.ToString();
cmd.CommandText = "INSERT INTO tbbook (bookname,masir) values(@1,@5)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@1", bb);
cmd.Parameters.AddWithValue("@5", mas);
iud(cmd);

}
}

و اما دوست عزیزم جناب C#‎‎_best_Programmer (http://barnamenevis.org/member.php?284719-C-%E2%80%8E_best_Programmer)
ممنون از پاسختون ،میشه یه توضیح بدین چطور خلاقانه این کار و کلا برنامه نویسی انجام بدیم ما که مبتدی هستیم کدهای مبتدیانه ای هم مینویسیم

C#‎_best_Programmer
جمعه 25 اسفند 1391, 21:37 عصر
همه ی ما مبتدی هستیم چون عادت داریم همه چی و آمادشو استفاده کنیم
www.bestprogrammers.blogfa.com

FastCode
جمعه 25 اسفند 1391, 21:40 عصر
ببخشید.
اشتباه شد
از item.FullName باید استفاده کنید.
قبلش باید cast کنید.

esafb52
جمعه 25 اسفند 1391, 21:49 عصر
میشه بیشتر توضیح بدین و حتی الاامکان با یه نمونه کد باشه بهتره؟
اصلا یک سوال دیگه :
من چطور اسم یک فایل رو تو لیست باکس تو یک مسیر چند فولدری بگیرم؟؟؟؟مثلاH:\c#\pdf library\pdf library\bin\Debug\t.txt
t رو چطورتو لیست باکس بگیرم؟؟

RED-C0DE
جمعه 25 اسفند 1391, 22:05 عصر
از این دید ب مسئلتون نگاه کنین:
شما می خواین در نهایت یک لیست داشته باشید ک از هر آیتم اون بتونین اون 2 موردی ک ذکر کردین رو در بیارین.
ممکنه فردا بخواین چیزای دیگه ای هم از این آیتم در بیارین (پسوند، آخرین تاریخ تغییر ، ...)
یک کلاس تعریف کنید برای این ساختارتون و در نهایت هر Item در ListBox تون ، یک آبجکت از جنس این کلاس باشن.

خلاصه اینکه ساختار و منطق تجاری برنامتون رو از ظاهر جدا کنید.


مثلا :
public class MyFileInfo
{
public string FileName {get;set;}
public string FullPath {get;set;}
// ...

public override string ToString()
{
return string.Format("{0}", FileName);
}
}

در نهایت موقعی ک می خواین ب لیست ، آیتم اضافه کنید :
MyFileInfo f = new MyFileInfo() { .....}
MyListBox.Items.Add(f);

FastCode
جمعه 25 اسفند 1391, 22:30 عصر
از این دید ب مسئلتون نگاه کنین:
شما می خواین در نهایت یک لیست داشته باشید ک از هر آیتم اون بتونین اون 2 موردی ک ذکر کردین رو در بیارین.
ممکنه فردا بخواین چیزای دیگه ای هم از این آیتم در بیارین (پسوند، آخرین تاریخ تغییر ، ...)
یک کلاس تعریف کنید برای این ساختارتون و در نهایت هر Item در ListBox تون ، یک آبجکت از جنس این کلاس باشن.

خلاصه اینکه ساختار و منطق تجاری برنامتون رو از ظاهر جدا کنید.


مثلا :
public class MyFileInfo
{
public string FileName {get;set;}
public string FullPath {get;set;}
// ...

public override string ToString()
{
return string.Format("{0}", FileName);
}
}

در نهایت موقعی ک می خواین ب لیست ، آیتم اضافه کنید :
MyFileInfo f = new MyFileInfo() { .....}
MyListBox.Items.Add(f);

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

@OP
البته از کد شما ۱۰۰ برابر بهتره.
اگر از روش من خوشتون نمیاد حد اقل این رو پیاده سازی کن.

linux
جمعه 25 اسفند 1391, 22:32 عصر
میشه بیشتر توضیح بدین و حتی الاامکان با یه نمونه کد باشه بهتره؟
اصلا یک سوال دیگه :
من چطور اسم یک فایل رو تو لیست باکس تو یک مسیر چند فولدری بگیرم؟؟؟؟مثلاH:\c#\pdf library\pdf library\bin\Debug\t.txt
t رو چطورتو لیست باکس بگیرم؟؟
دوست عزیز استفاده از کلاسهای موجود در دات نت و آشنایی با آنها به مرور زمان صورت می‌گیرد و شرطش این هست که مستندات هر کلاسی که کار می‌کنی را از MSDN ببینی که بتوانی حداکثر استفاده را از آن ببری و تا جایی که می توانید کدها را طوری بنویسید که قابلیت استفاده مجدد داشته باشند.
private void btnLoad_Click(object sender, EventArgs e)
{
var fd = new FolderBrowserDialog();
if (fd.ShowDialog() == DialogResult.OK)
{
Prepare(GetPdfFiles(fd.SelectedPath, false));
}
}
public FileInfo[] GetPdfFiles(string path, bool searchSubdirectories)
{
var di = new DirectoryInfo(path);
if (searchSubdirectories)
return di.GetFiles("*.pdf", SearchOption.AllDirectories);
return di.GetFiles("*.pdf");
}

public void Prepare(FileInfo[] files)
{
foreach (var item in files)
{
listBox1.Items.Add(string.Format("path({0}),file Name:({1})", item.DirectoryName, item.Name));
}
}

esafb52
جمعه 25 اسفند 1391, 22:52 عصر
کد جالبی بود!!!
ممنون دیدن چنین کدهایی باعث افزایش افق دید برای ما مبتدی ها میشه
موفق باشی