در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 2 : پرکاربردترین ها

در ادامه مقالات آموزشی LINQ به بررسی ویژگی های زبان 3.0 #C خواهیم پرداخت که در نوشتن کوئری های LINQ پرکاربرد هستند و آشنایی با اونها پیش نیاز یادگیری LINQ هست و در بخش های بعدی با نحوه استفاده از این ویژگی ها در کوئری های LINQ آشنا خواهیم شد. ویژگی هایی که در این مقاله بررسی خواهیم کرد به شرح زیر است:

  1. Implicity Typed Variables
  2. Lamda Expressions
  3. Extension Methods
  4. Anonymous Types

1. اولین ویژگی که میخواهیم در مورد آن بحث کنیم ویژگی Implicity Typed Variables است. این ویژگی به شما این امکان رو میده تا انتخاب نوع داده تعریفی داخل کد را به عهده کامپایلر بزارید. برای مثال قطعه کد زیر رو در نظر بگیرید:

int i = 25

یک متغییر int تعریف کردیم و مقدار آن را مساوی 25 قرار دادیم، در #C نسخه 3.0 با استفاده از کلمه کلیدی var انتخاب نوع متغییر را به عهده کامپایلر بزاریم. انتخاب نوع بر اساس مقداری که داخل متغییر در هنگام تعریف رخته می شود (Initialization) انتخاب می شود:

var i = 12;
var s = "Welcome";
var d = 2.6;

در کد های بالا، متغیر i از نوع int، متغیر s از نوع string و متغیر d از نوع double در نظر گرفته می شود. فقط نکته ای که باید در نظر بگیرید این است که هنگام استفاده از کلمه var باید متغییر مقدار دهی اولیه شود. در غیر این صورت با پیغام خطا مواجه خواهید شد.

2. ویژگی بعدی Lamda Expressions هستند، این عبارات چیزی معادل Anonymous methods در نسخه های قبلی #C هستند. در بخش قبلی درباره متد FindAll کلاس جنریک
static void Main(string[] args)
{
    List list = new List() { 7, 9, 3, 1, 5, 6, 7 };
    List query = list.FindAll(Compare);
    foreach (int i in query)
        Console.WriteLine(i);
}

static bool Compare(int a)
{
    return a > 5;
}

همانطوری که در کد بالا مشاهده میکنید، متدی با عنوان Compare تعریف شده و به عنوان پارامتر به متد FindAll جهت مقایسه فرستاده می شود. اما روش بعدی استفاده از Anonymous Methods که با استفاده از کلمه کلیدی delegate می توان از آن استفاده کرد:

static void Main(string[] args)
{
    List list = new List() { 7, 9, 3, 1, 5, 6, 7 };
    List query = list.FindAll(delegate(int a) { return a > 5; });
    foreach (int i in query)
        Console.WriteLine(i);
}

کاربرد دیگه Anonymous Methods در استفاده از Event ها است که میتوان کد مربوط به یک Event را با استفاده از Anonymous Methods به صورت درجا تعریف کرد:
حالت اول:

public Form1()
{
    InitializeComponent();
    button1.Click += Button1_Click; 
}

public void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Welcome to C# world");
}

و با استفاده از Anonymous Methods:

public Form1()
{
    InitializeComponent();
    button1.Click += delegate(object sender, EventArgs e)
    {
        MessageBox.Show("Welcome To C#");
    };
}

اما از Lambda Expressions چگونه می توان استفاده کرد. عبارات Lambda همان کار Anonymous Methods را انجام می دهند با این تفاوت که دیگر نیازی به تعیین نوع پارامترهای ورودی تابع مورد نظر نیست! برای روش تر شدن قضیه به همان مثال متد FindAll توجه کنید، در کد زیر ما همان کد را با عبارات Lambda پیاده سازی میکنیم:

List query = list.FindAll(delegate(int a) { return a > 5; }); // anonymous methods with delegate keyword
List query = list.FindAll((n) => { return n > 5; }); // anonymous methods with Lambda Expressions

در کد بالا، در خط اول با استفاده از کلمه کلیدی delegate و در خط دوم با استفاده از Lambda Expressions، متد بی نام مورد نظر را پیاده سازی کردیم. تفاوت موجود در ساختار ها، عدم نیاز به تعیین نوع پارامتر های ورودی متد و استفاده از عملگر <= برای نشان دادن عبارات Lambda می باشد.

مثال دیگر همان تعیین متد مورد نظر برای ایونت Click کنترل Button است که در کد زیر با استفاده از عبارات Lambda آن را پیاده سازی کردیم:

button1.Click += (sender, e) =>
{
    MessageBox.Show("Welcome To C#");
};

نکات:
در صورتی که تعداد پارامتر های ورودی یکی باشد، می تواند پرانتز ها را حذف کرد، اما در صوروتی که تعداد پارامترها بیش از یکی باشد، باید آنها را داخل پرانتز قرار داد.

List query = list.FindAll(n => { return n > 5; });

button1.Click += (sender, e) =>
{
    MessageBox.Show("Welcome To C#");
};

در صورتی که تعداد دستورات داخل بدنه متد تنها یک دستور باشد، می توان از نوشتن {} خودداری کرد:

button1.Click += (sender, e) => MessageBox.Show("Welcome To C#");

در صورتی که متد مورد نظر، مقداری را برگرداند (مانند متد FindAll) و تعداد دستورات داخل بدنه متد تنها یک دستور باشد که حاصل را برمیگرداند، با حذف {} ها باید کلمه کلیدی return را نیز حذف کرد:

List query = list.FindAll(n => n > 5); // valid
List query = list.FindAll(n => return n > 5); // wrong

یکی از کاربرد های مهم عبارات Lambda در نوشتن کوئری های LINQ است که در بخش های بعدی مقالات با آنها بیشتر آشنا خواهیم شد.

3. یکی دیگر از ویژگی های جدید نسخه 3 زبان #C، متدهای توسعه یا Extension Methods هستند. این قابلیت به شما این امکان را می دهد تا به کلاس های موجود، متد های مورد نیاز خودتان را اضافه کنید. برای مثال، نوع داده int را فرض کنید. می خواهیم به این نوع داده، متدی با نام Negative را اضافه کنیم تا منفی عددی که داخل آن ذخیره شده است را برای ما برگرداند. برای این کار باید یک کلاس static ایجاد کرده و داخل آن متد های توسعه مورد نظر خود را بنویسیم. توجه کنید که خود متد توسعه نیز باید از نوع int باشد. برای درک بهتر این موضوع به کد زیر توجه کنید:

class Program
{

    static void Main(string[] args)
    {
        int myInt = 25;
        Console.WriteLine(myInt.Negative());
    }

}

static class Extensions
{
    public static int Negative(this int i)
    {
        return -i;
    }
}

با قطعه کد بالا، در داخل کلاس Extensions، ما یک متد با نام Negative برای نوع داده int تعریف کردیم. ساختار نوشتن متدهای Extensions مانند نوشتن سایر متدها می باشد، با این تفاوت که اولین پارامتر ورودی این تابع، نشان دهنده یک Instance از نوعی است که می خواهیم متد مورد نظر به آن اضافه شود. همچنین این متد ها همیشه باید به صورت Static نوشته شوند. در بخش بالای کد و داخل متد Main ما از این متد استفاده کردیم. توجه کنید که متدهای توسعه تنها از طریق Instance های ایجاد شده از روی یک نوع داده قابل دستری هستند. نحوه نمایش متد های توسعه با سایر متدها، در Intellisence محیط VS فرق دارد. در کنار این متد ها، یک فلش آبی رنگ به سمت پایین وجود دارد که نشان دهنده یک متد توسعه است.

4. ویژگی بعدی که در مورد آن صحبت خواهیم کرد نوع های بی نام یا Anonymous Types هستند. این نوع ها با کمک کلمه کلیدی var تعریف شده و می توانند دارای یکسری خصوصیات باشند. برای مثال، می توانیم یک نوع بدون نام که دارای خصوصیات FirstName و LastName باشد را تعریف کنیم، بدون اینکه نیازی به تعریف یک کلاس جدید باشد. به مثال زیر توجه کنید:

var myAnonymousType = new { FirstName = "Hosein", LastName = "Ahmadi" };
Console.WriteLine(myAnonymousType.FirstName + myAnonymousType.LastName);

با استفاده از کد بالا یک نوع بدون نام ایجاد شد. انتخاب نام این نوع به عهده کامپایلر است. اگه به کد IL ایجاد شده توسط کامپایلر نگاهی بندازیم می بینیم که خود کامپایلر نامی برای این نوع در نظر میگیره:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 3
    .locals init (
    [0] class <>f__AnonymousType0`2 myAnonymousType)
    L_0000: nop 
    L_0001: ldstr "Hosein"
    L_0006: ldstr "Ahmadi"
    L_000b: newobj instance void <>f__AnonymousType0`2::.ctor(!0, !1)
    L_0010: stloc.0 
    L_0011: ldloc.0 
    L_0012: callvirt instance !0 <>f__AnonymousType0`2::get_FirstName()
    L_0017: ldloc.0 
    L_0018: callvirt instance !1 <>f__AnonymousType0`2::get_LastName()
    L_001d: call string [mscorlib]System.String::Concat(string, string)
    L_0022: call void [mscorlib]System.Console::WriteLine(string)
    L_0027: nop 
    L_0028: ret 
}

نکته قابل توجه دیگر اینجاست که اگه دو نوع بدون نام دارای خواص یکسان باشند، می توانند به صورت Implicit به یکدیگر Cast شوند، مثال:

var myAnonymousType1 = new { FirstName = "Hosein", LastName = "Ahmadi" };
var myAnonymousType2 = new { FirstName = string.Empty, LastName = string.Empty };
myAnonymousType2 = myAnonymousType1;
Console.WriteLine(myAnonymousType2.FirstName + myAnonymousType2.LastName);

نوع های بدون نام کابردهای زیادی در کوئری های LINQ دارن که در بخش های بعدی با آنها آشنا خواهیم شد.

این چهار ویژگی، مهمترین ویژگی هایی بودند که در کوئری های LINQ کاربرد دارند.

در بخش بعدی مقالات آموزشی LINQ، در مورد ساختار کوئری های LINQ و همچنین نحوه اجرای کوئری ها صحبت خواهیم کرد.

موفق باشید
#آموزش_linq
عنوان
1 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 1 : مقدمات رایگان
2 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 2 : پرکاربردترین ها رایگان
3 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 3 : ساختار اجرای کوئری رایگان
4 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 4 : عملگرهای استاندارد رایگان
5 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 5 : عملگرهای استاندارد رایگان
6 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 6 : عملگرهای استاندارد رایگان
7 آموزش لینک (LINQ) صفر تا صد در دات نت قسمت 7 : عملگرهای استاندارد رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....