PDA

View Full Version : سوال: کپی عینا چند خط کد در جاهای مختلف برنامه



mina68
جمعه 25 شهریور 1390, 19:51 عصر
با سلام خدمت اساتید محترم
چند خط کد در یک select case نوشتم که قسمتیش در هر case عینا نکرار می شه دستورات به گونه ایی هست که نمی شه به صورت تابع در آورد
یادمه در turbo c روشی بود که به چند خط کد اسم می دادن و با فراخوانی اسم مانند این بود که اون خط ها در مکان فراخوانی عینا کپی شده( منظورم تابع نیست)
آیا در c# راهی برای انجام همچین کاری وجود داره؟
ونام این روش چی بود؟

bozhmehrani
جمعه 25 شهریور 1390, 23:14 عصر
آره منم یه چیزایی یادمه
برای چند خط کد یه نام میزاشتیم و بعد دو نقطه
و هرجا بخوایم دسترسی داشته باشیم کلمه کلیدی goto و نام اونو می نوشتیم .

Parham.D
شنبه 26 شهریور 1390, 09:34 صبح
کاری که من انجام میدم انتخاب کدها و درگ کردن آنها به ToolBox و در قسمت General هست. با این کار یک بلوک کد در آنجا تشکیل میشه. در هر جا که خواستید روی بوک کد دابل کلیک کنید تا کدها در محل جدید کپی شود.

mina68
شنبه 26 شهریور 1390, 11:00 صبح
ممنون روش جالبی بود
ولی آیا راهی هست که از طریق برنامه نویسی بشه همین کارو کرد به طوری که اگه جایی لازم شد قسمتی از این چند خط کد تکراری تغییر پیدا کنه دوباره لازم نباشه به صورت دستی تغییرات رو همه جاهایی که از اون کد ها استفاده کردم بدم ؟:متفکر:

amin_rezaee
شنبه 26 شهریور 1390, 11:33 صبح
ممنون روش جالبی بود
ولی آیا راهی هست که از طریق برنامه نویسی بشه همین کارو کرد به طوری که اگه جایی لازم شد قسمتی از این چند خط کد تکراری تغییر پیدا کنه دوباره لازم نباشه به صورت دستی تغییرات رو همه جاهایی که از اون کد ها استفاده کردم بدم ؟:متفکر:
اگه کدهاتون عینا تکرار میشن بهترین راه استفاده از تابع هست یا اینکه ممکنه بتونید کدهای تکراری را در پایان دستور case بنویسید طوریکه هر کیسی که اجرا شد نهایتا اون دستورای بعدش اجرا شه.که این بستگی به منطق برنامتون داره.

gwbasic
شنبه 26 شهریور 1390, 13:29 عصر
چرا نمی تونید برای اون چند خط کد متد بنویسید؟ حتما می شه
به این فکر کنید که اون چند خط کد تغییری لازم داشته باشه! اونقت می خوان چی کار کنین؟ همه جا رو باید تغییر بدین

در ضمن اگه قراره در هر case اجرا بشه باز هم به این فکر کنید که بیرون از Switch بنویسید یا قبل یا بعدش

mina68
شنبه 09 مهر 1390, 09:59 صبح
var Items = (from Rec in Bank.TBL where Rec.ID = 2
select new {ID = Rec.ID,
Name = Rec.Name,
LName = Rec. LName,
.
.
.


var Items = (from Rec in Bank.TBL where Rec.Name = "Test"
select new {ID = Rec.ID,
Name = Rec.Name,
LName = Rec. LName,
.
.
.


همانطور که مشاهده می کنید فقط قسمت شرط where آن تغییر می کنه("Rec.Name = "Test و Rec.ID = 2 و...) می خوام اون رو تبدیل به تابع کنم ولی نمی دونم چطور می شه این کار رو کرد
شما چی به نظر تون می رسه؟

wolf_majid
شنبه 09 مهر 1390, 10:32 صبح
البته کد من یک مقدار درهم و با سی شارپه اما فکر کنم بتونید راه حل رو از توش در بیارید

public enum RecItems
{
ID,
Name
};


public string test(RecItems rec, object response)
{
return "from Rec in Bank.TBL where " + rec + " = " + response + " select new {ID = Rec.ID, Name = Rec.Name, LName = Rec. LName, ";
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(test(RecItems.ID,2)
+"\n"+test(RecItems.Name ,"test"));
}

mina68
شنبه 09 مهر 1390, 11:00 صبح
ممنون از پاسختون
ولی کد های من خودش دستورات linq هست نه query sql دوست عزیز ، فکر نمی کتم تبدیل اونها به string بتونه پاسخ گوی کاری که من می خوام باشه !

wolf_majid
شنبه 09 مهر 1390, 11:21 صبح
فهمیدم
متاسفانه linq هم بلد نیستم اما مطمئنا" می شه اون کدها رو هم تبدیل به تابع کرد
این نمونه کد را فقط برای راهنمایی گذاشتم که شاید الگویی دستتون بیاد

mehdi.mousavi
شنبه 09 مهر 1390, 11:48 صبح
همانطور که مشاهده می کنید فقط قسمت شرط where آن تغییر می کنه("Rec.Name = "Test و Rec.ID = 2 و...) می خوام اون رو تبدیل به تابع کنم ولی نمی دونم چطور می شه این کار رو کرد
شما چی به نظر تون می رسه؟

سلام.
با فرض اینکه Entity Container شما، اسمش BankEntities هستش و قراره تابع مزبور لیستی از BankRecord ها رو برگردونه، می تونید تابعی بدین شکل بنویسید:


private List<BankRecord> GetBankRecords(BankEntities context, Func<BankRecord, bool> predicate)
{
return context.BankRecords.Where(predicate).Select(b => new BankRecord { Name = b.Name, LName = b.LName }).ToList();
}

حالا فرض کنید می خواهیم کلیه BankRecord هایی رو بگیریم که ID ی اونها 2 هستش. می تونیم بدین شکل عمل کنیم:

GetBankRecords(context, b => b.ID == 2);

یا تمام BankRecord هایی رو میخواهیم که Name اونها Test هستش:

GetBankRecords(context, b => b.Name == "Test");

موفق باشید.

پاورقی: به یک نکته ظریف دقت کنید! تابع فوق مجموعه ای از BankRecord ها رو برمیگردونه، و نه یک Anonymous Type را. این مساله بدین دلیل هستش که ما نمیتونیم یک var رو در Return Value تابع استفاده کنیم.

gwbasic
شنبه 09 مهر 1390, 12:08 عصر
جواب سوال شما دونستن یک مطلب هست و اونم اینه که شما می تونید توی LINQ از متغیر محلی در متدتون استفاده کنید
خوب حالا اونطور که من دیدم شما دو تا query دارین یکی بر اساس id و دیگری بر اساس Name هستش. اگه اینطوره شما باید دو تا متد بنویسید یکی دارای پارامتری برای گرفتن id باشه و دیگری دارای پارامتر name باشه بعد توی متد ها و همون پارامتر رو قرار بدین


public List<object> QueryOne(int id)
{
var Items = (from Rec in Bank.TBL where Rec.ID = id
select new {ID = Rec.ID,
Name = Rec.Name,
LName = Rec. LName,
.
.

} .

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

mina68
شنبه 09 مهر 1390, 13:55 عصر
اونطور که من دیدم شما دو تا query دارین یکی بر اساس id و دیگری بر اساس Name هستش. اگه اینطوره شما باید دو تا متد بنویسید یکی دارای پارامتری برای گرفتن id باشه و دیگری دارای پارامتر name باشه
نه دوست عزیز فقط همین دو تا query نیست ، این query در جاهای مختلف برنامه شرط های مختلف داره که اگر بخوام برای هر کدام یک متد بنویسم که دیگه با خود کد رو نوشتن فرقی نمی که !

gwbasic
شنبه 09 مهر 1390, 15:54 عصر
اگه شما تعداد زیاد query دارید بهترین روش همون راهی هست که آقای موسوی ارائه کردند حالا چه به صورت متد چه داخل کدتون همون شرط رو به صورت Lambda Experssion بنویسید. اگه از متد استفاده می کنید همونطور که آقای موسوی اشاره کردند دیگه نمی تونید از Anonymous Typeَ استفاده کنید و باید احتمالا از لیستی از DataRow استفاده کنید