PDA

View Full Version : چند سوال ساده در مورد عبارات لامبدا - Lambda



farhad26
پنج شنبه 22 مرداد 1394, 17:33 عصر
سلام
چند تا سوال ساده دارم در مورد استفاده از عبارت لاندا

1.نحوه استفاده از لاندا به چه صورتی هست؟ اگر توضیحاتی در موردش بدید ممنون میشم

2. ایا برای استفاده از عبارت لاندا حتما به delegate احتیاج داریم؟
مثلا برای این کد هیچ عاملی (delegate) تعریف نشده اما از <= استفاده شده :


List<string> names = new List<string>();
names.Add("Kalyan");
names.Add("Suresh");
names.Add("Naveen");
string strResult = names.Find(i => i.Equals("Naveen"));
Console.WriteLine(strResult);


فقط خواهشا پاسم ندید به جای دیگه
خیلی گشتم اما برام مفهوم نشده :متفکر:

ژیار رحیمی
پنج شنبه 22 مرداد 1394, 22:07 عصر
در حالت استفاده از LINQ شما به دو شیوه میوتونی query هاتو بنویسی.1-query syntax و 2- fluent syntax
در ایتجا یه query که به دو روش پیاده سازی شده
پیاده سازی به روش اول دستورات به این شیوه نوشته میشود

var result = from c in Customers
where c.City.StartsWith("B")
orderby c.LastName
select new { c.FirstName, c.LastName, c.Address };


و همین query به روش دوم به اینصورت پیاده سازی میشود

var result = Customers.Where( c => c.City.StartsWith("B") )
.OrderBy( c => c.LastName )
.Select( c => new { c.FirstName, c.LastName, c.Address } );



دو روش پیاده سازی هیچ فرقی باهم ندارن .یه نظر من روش دوم آسانتر و بشخصه از روش دوم استفاده میکنم.

بله از delegate استفاده میشود <=c حرف اشاره به پارامتر ورودی delegate داره که در حالت ساده شده مثال کد های بالا به این صورت است

Customers.Where( c => c.City.StartsWith("B") )

که در حالت خلاصه نشده delegate آن به اینصورت میباشد

Customers.Where((Customer c) => c.City.StartsWith("B") )

چون پارامترهای delegate بصورت تکی هست احتیاجی به گذاشتن پرانتز ندارد و همچنین چون کامپایلر امکان تشخیص نوع پارامتر ورودی delegate را هم دارد به نوع آن در حالت ساده شده اشاره نشده

farhad26
پنج شنبه 22 مرداد 1394, 22:44 عصر
تشکر بابت جوابتون
یک قسمتش برام قابل فهم نیست
اینکه در کد زیر ما هیچ delegate یی تعریف نکردیم اما کد اجرا میشه


List<string> names = new List<string>();

names.Add("Kalyan");

names.Add("Suresh");

names.Add("Naveen");

string strResult = names.Find(i => i.Equals("Naveen"));

Console.WriteLine(strResult);




در اینجا i چه معنی داره ؟

hakim22
پنج شنبه 22 مرداد 1394, 23:12 عصر
مقدار i در اینجا مقدار ورودی به تابع و هرچیزی که بعد از <= قرار میدهید تابع مورد نظر شماست. در واقع Lambda Expression توابعی هستند که شما درون کد ایجاد میکنید و نیاز به تعریف جدا به صورت یک متد در یک کلاس ندارند. شما می توانید بیش از یک مقدار ورودی داشته باشید .

همچنین در LINQ از مفهوم Higher Order Function استفاده شده است. این یک قابلیت جدید در دات نت 4 به بعد است که شما میتوانید بجای ورودی به صورت پارامتر یک ورودی به صورت یک تابع داشته باشید. میتوانید عبارت Func رو در زبان برنامه نویسی #C جستجو کنید. شما میتوانید بجای :

i => i.Equals("Naveen")


یک تابع به صورت Func هم تعریف کنید.

farhad26
جمعه 23 مرداد 1394, 00:23 صبح
ممنون بابت راهنماییتون
تازه از گفته هاتون مسئله برام روشن شد

farhad26
جمعه 23 مرداد 1394, 00:24 صبح
اقا طبق بررسی هایی که کردم و طبق راهنمایی های شما متد Find() یک پارامتر ورودی از نوع عامل ژنریک Predicate T داره
یعنی در این کد :

Find(i => i.Equals("Naveen"));



i پارامتری از عامل Predicate هست

درسته ؟
اگه اشتباه گفتم میخام بدونم عاملی که i پارامترش هست کجاست !

babakj
پنج شنبه 19 آذر 1394, 14:14 عصر
در حالت استفاده از LINQ شما به دو شیوه میوتونی query هاتو بنویسی.1-query syntax و 2- fluent syntax
در ایتجا یه query که به دو روش پیاده سازی شده
پیاده سازی به روش اول دستورات به این شیوه نوشته میشود
[CSHARP]
var result = from c in Customers
where c.City.StartsWith("B")

آقای رحیمی خیلی عالی توضیح دادید .. آیا روشی هست که من بتونم به همه جوابهای شما در سایت دسترسی داشته باشم و آنها را مرور کنم ؟