LookUp در LINQ
پنجشنبه 19 فروردین 1395در این مقاله قصد داریم شما را با یک کلاس جدید به نام LookUp در #C آشنا کنیم و تفاوت آن را با Dictionary بررسی کنیم و این تفاوت ها با بررسی کدهای مربوط به آنها مورد بررسی قرار میگیرد.
ممکن است برای شما پیش آمده باشد که در پروژه های مختلف نیاز داشته باشید چندین بار، 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]);
- C#.net
- 2k بازدید
- 2 تشکر