PDA

View Full Version : سوال: معادل دستور در LINQ



nathan
پنج شنبه 03 فروردین 1391, 18:34 عصر
با سلام دوستان اگه بخوايم معادل اين دستورات رو با Linq بنويسيم روش كار چطوريه؟



foreach (ToolStripItem item in toolsMain.Items)
{
if (item.Tag.ToString() == e.ClickedItem.Tag.ToString())
{
toolsMain_ItemClicked(toolsMain, new ToolStripItemClickedEventArgs(item));
break;
}
}

nathan
جمعه 04 فروردین 1391, 08:06 صبح
دوستان نظري وجود نداره؟

C#.net
جمعه 04 فروردین 1391, 13:35 عصر
از آنجا که از break استفاده کردید، تکه کد شما فقط اولین آیتمی که شرط رو ارضا می کنه رو به handler فراخوانی شده می فرسته.



// The item you are looking for
var item = toolsMain.Items.First(p => p.Tag.ToString() == e.ClickedItem.Tag.ToString());
// calling the handler with the item
toolsMain_ItemClicked(toolsMain, new ToolStripItemClickedEventArgs(item));



حالا اگه می خواستید برای همه ی آیتم های داری شرط مورد نظر handler رو فراخوانی کنید(بدون break )



// The items satisfy the condition
var items = toolsMain.Items.Where(p => p.Tag.ToString() == e.ClickedItem.Tag.ToString()).ToList();
// calling the handler with items above
items.ForEach(p => toolsMain_ItemClicked(toolsMain, new ToolStripItemClickedEventArgs(p)));



این هم سینتکسی جهت نوشتن دستورات بیشتر در ForEach


.ForEach(p =>
{
Op1();
Op2();
Op3();
});


نکته: بهتره به صورت مستقیم handler رو در توابع دیگه فراخوانی نکنید، می تونید در handler متدی رو فراخوانی کنید که عملیات مورد نظر رو انجام می ده و در اینجا هم همون متد رو فراخوانی کنید.

nathan
شنبه 05 فروردین 1391, 10:40 صبح
دوست عزيز از جوابتون سپاسگزارم اما از بيخ غلطه چون First نداريم و p.Tag هم اصلاً عمل نمي كنه و در كل جواب نمي ده ما در زيرمجموعه Items فقط متد Find داريم كه اون هم تازه دو تا آرگومان مي گيره!

C#.net
شنبه 05 فروردین 1391, 10:43 صبح
:لبخندساده:

using System.Linq;

nathan
شنبه 05 فروردین 1391, 10:54 صبح
دوستان فكر كنم اين كار كنه :



var tsb = from ToolStripItem crButton in toolsMain.Items where crButton.Tag.ToString() == e.ClickedItem.Tag.ToString() select crButton;
toolsMain_ItemClicked(toolsMain, new ToolStripItemClickedEventArgs(tsb as ToolStripItem));

nathan
شنبه 05 فروردین 1391, 11:48 صبح
نه اينم جواب نمي ده چون وقتي وارد toolsMain_ItemClicked مي شه خطاي object refrence مي گيره!

C#.net
شنبه 05 فروردین 1391, 12:19 عصر
دوست عزيز از جوابتون سپاسگزارم اما از بيخ غلطه چون First نداريم و p.Tag هم اصلاً عمل نمي كنه و در كل جواب نمي ده ما در زيرمجموعه Items فقط متد Find داريم كه اون هم تازه دو تا آرگومان مي گيره!

:لبخندساده:

using System.Linq;



// The item you are looking for
var item = toolsMain.Items.First(p => p.Tag.ToString() == e.ClickedItem.Tag.ToString());
// calling the handler with the item
toolsMain_ItemClicked(toolsMain, new ToolStripItemClickedEventArgs(item));


شما using رو اضافه کردید ببینید ؟

nathan
یک شنبه 06 فروردین 1391, 00:23 صبح
بله using رو هم اضافه كردم اما جواب نمي ده آخر سر از خيرش گذشتم چون وقتي منتقل مي شه Object Refrence not set مي ده! به عبارتي از item به عنوان يك كليد نوار ابزار نمي شه استفاده كرد! در ضمن First رو هم نتونستم بيارم