LookUp در LINQ

پنجشنبه 19 فروردین 1395

در این مقاله قصد داریم شما را با یک کلاس جدید به نام LookUp در #C آشنا کنیم و تفاوت آن را با Dictionary بررسی کنیم و این تفاوت ها با بررسی کدهای مربوط به آنها مورد بررسی قرار میگیرد.

LookUp در LINQ

ممکن است برای شما پیش آمده باشد که در پروژه های مختلف نیاز داشته باشید چندین بار، list  را به dictionary تبدیل کنید، المان های مختلف در dictionary بسته بندی میشوند و در نهایت یک key به کاربر برمیگرداند، البته در JSON ، یک value pair به کاربر برگردانده میشود.چیزی شبیه dictionary  به نام LOOKUP وجود دارد که روش کار آن بسیار جالب است.

در این قسمت  میخواهیم توضیح دهیم که Lookup چیست و تفاوت اصلی بین Lookup و dictionary  در C# چیست.

1.ما میتوانیم یک شی از dictionary  ایجاد کنیم اما نمیتوانیم از Lookup شی بسازیم.در حقیقت از Lookup تنها برای تبدیل یک نوع داده به نوع دیگر میتوان استفاده کرد. برای مثال تبدیل یک list به Lookup و ... .

این خطایی است که در هنگام ساختن یک شی از Lookup  با آن مواجه خواهید شد.

اگر شما بر روی  Lookup کلیک راست کنید و بخواهید که تعریف دومی از  کلمه مورد نظرتان را ببینید، متوجه خواهید شد که برای این منظور هیچ constructor  در کلاس Lookup تعریف نشده است.

اما اگر به dictionary  توجه کنید می بینید که از dictionary  میتوانید شی بسازید و یک  constructor  برای آن تعریف شده است که میتوانید در زیر آن را ببینید.

2..در دیکشنری یک key value داریم که به صورت جفت هستند ، این کلید در دیکشنری نباید تکراری باشد. اما در Lookup  میتوانیم  چندین value با یک key داشته باشیم.

Dictionary:

LookUp:

در این  قسمت میخواهیم یک برنامه بنویسیم که در آن چندین مقدار تکراری داریم.

در ابتدا از Lookup استفاده میکنیم.

1.	static void Main(string[] args)  
2.	{  
3.	    List < Employee > li = new List < Employee > ();  
4.	    li.Add(new Employee  
5.	    {  
6.	        Id = 1, age = 19, name = "Ritesh", gender = "M"  
7.	    });  
8.	    li.Add(new Employee  
9.	    {  
10.	        Id = 2, age = 20, name = "sujit", gender = "M"  
11.	    });  
12.	    li.Add(new Employee  
13.	    {  
14.	        Id = 3, age = 23, name = "Kabir", gender = "F"  
15.	    });  
16.	    li.Add(new Employee  
17.	    {  
18.	        Id = 4, age = 3, name = "mantu", gender = "F"  
19.	    });  
20.	    li.Add(new Employee  
21.	    {  
22.	        Id = 5, age = 24, name = "Kamlesh", gender = "M"  
23.	    });  
24.	    li.Add(new Employee  
25.	    {  
26.	        Id = 6, age = 28, name = "Manoj", gender = "M"  
27.	    });  
28.	    li.Add(new Employee  
29.	    {  
30.	        Id = 6, age = 28, name = "xxxx", gender = "M"  
31.	    });  
32.	    var res = li.ToLookup(x => x.Id);  
33.	}  

در این کد ، ما یک list را به Lookup  تبدیل کردیم: list شامل مقادیری با id تکراری است و در lookup که ما آنرا ایجاد کردیم id را بعنوان کلید در نظر گرفتیم اما با این حال برنامه اجرا خواهد شد و بدلیل این است که lookup شامل  keyهای تکراری میشود.

حالا میخواهیم یک برنامه ی دیگر بنویسیم که در آن رکوردهای تکراری داریم و این بار ، آنرا با dictionary بررسی میکنیم.قبل از تبدیل لیست به dictionary، دستور مربوط به آن را مشخص میکنیم.

و بعد از تبدیل لیست به dictionary با این خطا روبرو میشویم.

3.در LookUp  مقادیر key را می توانیم به روش زیر  چاپ کنیم :

1.	var details = li.ToLookup(x => x.Id);  
2.	foreach(var s in details)  
3.	{  
4.	    Console.WriteLine(s.Key);  
5.	}  

و در  dictionary  روشهای متفاوتی برای چاپ keyها وجود دارد.یکی از این روش ها این است:

1.	var result = li.ToDictionary(x => x.Id, x => x.name);  
2.	foreach(KeyValuePair < int, string > s in result)  
3.	{  
4.	    Console.WriteLine(s.Key);  
5.	}  

4.در داخل کلاس lookup هیچ متد add, clear, remove وجود ندارد، بنابراین این عملیات ها را نمیتوانیم در lookup انجام دهیم.تنها کاری که  با lookup میتوان انجام داد تبدیل یک نوع داده به Lookup است، اما عملیاتی مانند  add, remove, clear به راحتی در dictionary قابل انجام است.

5.در lookup میتوانیم المان ها را گروه بندی کنیم همانطوری که در dictionary میتوانیم این کار را انجام دهیم. برای هر گروه بندی، اگر شرایط موجود منطبق با شرایط در نظر گرفته باشد، key المانهای مربوطه TRUE خواهد شد و اگر شرایط منطبق نبود key آن المانها FALSE خواهدشد.

در LookUP  به روش زیر میتوانیم گروه بندی کنیم.

1.	static void Main(string[] args)    
2.	{    
3.	    List<Employee> li = new List<Employee>();    
4.	    li.Add(new Employee { Id = 1, age = 19, name = "Ritesh", gender = "M" });    
5.	    li.Add(new Employee { Id = 2, age = 20, name = "sujit", gender = "M" });    
6.	    li.Add(new Employee { Id = 3, age = 23, name = "Kabir", gender = "F" });    
7.	    li.Add(new Employee { Id = 4, age = 3, name = "mantu", gender = "F" });    
8.	    li.Add(new Employee { Id = 5, age = 24, name = "Kamlesh", gender = "M" });    
9.	    li.Add(new Employee { Id = 6, age = 28, name = "Manoj", gender = "M" });         
10.	  
11.	}   

1.	var result = li.ToLookup(x => x.Id > 4);  

در عکس زیر مشاهده میکنید که المانهایی که با شرط مطابقت دارند یا بزرگتر از چهار هستند key آنها TRUE است، اما برای سایر المانها FALSE خواهد بود و Dictionary هم در این مورد به همین شکل عمل میکند.

برای Dictionary از کلمه ی کلیدی GroupBy  برا ی گروه بندی استفاده کنیم.

6.برای این که بررسی کنیم که المان مشخصی در lookup  وجود دارد یا نه از متد contain زیر استفاده میکنیم.

1.	var res = li.ToLookup(x => x.Id);    
2.	if(res.Contains(3))    
3.	{    
4.	    Console.WriteLine("key present");    
5.	}      

اما در  این مورد برای  Dictionary گزینه هایی وجود دارد همانطور که برای نشان دادن مقادیر گزینه هایی وجود دارد.

7.چاپ هر المان برای هر key در LookUp با دستورات زیر انجام میشود.

    var res = li.ToLookup(x => x.Id);    
    foreach(var p in res[5])    
    {    
        Console.WriteLine(p.name);    
      
    }    

اما در Dictionary  ما مقدار را به صورت مستقیم و به روش زیر چاپ میکنیم.

1.	Console.WriteLine(res1[3]);  

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید